Has anyone had success uploading an attachment larger than 10 MBs to an ArcGIS Online hosted feature service? I know that this is not possible via a web browser. I'm trying to upload a video (.mp4) around 50 MBs. I broke the video into smaller chunks so that each .mp4 is less than 10 MBs. I tried the following python script using the uploadPart and addAttachment REST functions to achieve this, but keep receiving an error in the addPart function:
{u'error': {u'message': u'', u'code': 400, u'details': [u'Unable to upload item.']}}
Below is my script. Any help is appreciated.
<SPAN class="keyword token">import</SPAN> requests<SPAN class="punctuation token">,</SPAN> json<SPAN class="punctuation token">,</SPAN> os
<SPAN class="comment token"># Disable warnings</SPAN>
requests<SPAN class="punctuation token">.</SPAN>packages<SPAN class="punctuation token">.</SPAN>urllib3<SPAN class="punctuation token">.</SPAN>disable_warnings<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># Variables</SPAN>
username <SPAN class="operator token">=</SPAN> <SPAN class="string token">"jskinner_Tred"</SPAN>
password <SPAN class="operator token">=</SPAN> <SPAN class="string token">"****"</SPAN>
id <SPAN class="operator token">=</SPAN> <SPAN class="number token">1252</SPAN>
TempDir <SPAN class="operator token">=</SPAN> r<SPAN class="string token">"D:\Projects\Treddyfrin\Temp"</SPAN>
<SPAN class="comment token"># Generate AGOL Token</SPAN>
tokenURL <SPAN class="operator token">=</SPAN> <SPAN class="string token"><SPAN>'</SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=https%3A%2F%2Fwww.arcgis.com%2Fsharing%2Frest%2FgenerateToken" target="_blank">https://www.arcgis.com/sharing/rest/generateToken</A><SPAN>'</SPAN></SPAN>
params <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="string token">'f'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'pjson'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'username'</SPAN><SPAN class="punctuation token">:</SPAN> username<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'password'</SPAN><SPAN class="punctuation token">:</SPAN> password<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'referer'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token"><SPAN>'</SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=http%3A%2F%2Fwww.arcgis.com" target="_blank">http://www.arcgis.com</A><SPAN>'</SPAN></SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'expiration'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="number token">21600</SPAN><SPAN class="punctuation token">}</SPAN>
r <SPAN class="operator token">=</SPAN> requests<SPAN class="punctuation token">.</SPAN>post<SPAN class="punctuation token">(</SPAN>tokenURL<SPAN class="punctuation token">,</SPAN> data <SPAN class="operator token">=</SPAN> params<SPAN class="punctuation token">,</SPAN> verify<SPAN class="operator token">=</SPAN><SPAN class="token boolean">False</SPAN><SPAN class="punctuation token">)</SPAN>
response <SPAN class="operator token">=</SPAN> json<SPAN class="punctuation token">.</SPAN>loads<SPAN class="punctuation token">(</SPAN>r<SPAN class="punctuation token">.</SPAN>content<SPAN class="punctuation token">)</SPAN>
token <SPAN class="operator token">=</SPAN> response<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'token'</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="comment token"># Register Item</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Registering Item"</SPAN><SPAN class="punctuation token">)</SPAN>
uploadURL <SPAN class="operator token">=</SPAN> <SPAN class="string token"><SPAN>'</SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=https%3A%2F%2Fservices2.arcgis.com%2Fo9a0D2ZwwG8CDFVQ%2Farcgis%2Frest%2Fservices%2FSewers%2FFeatureServer%2Fuploads%2Fregister" target="_blank">https://services2.arcgis.com/o9a0D2ZwwG8CDFVQ/arcgis/rest/services/Sewers/FeatureServer/uploads/register</A><SPAN>'</SPAN></SPAN>
params <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="string token">'f'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'pjson'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'token'</SPAN><SPAN class="punctuation token">:</SPAN> token<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'itemName'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'attachment1252'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'description'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'Attachment for feature 1252'</SPAN><SPAN class="punctuation token">}</SPAN>
r <SPAN class="operator token">=</SPAN> requests<SPAN class="punctuation token">.</SPAN>post<SPAN class="punctuation token">(</SPAN>uploadURL<SPAN class="punctuation token">,</SPAN> data <SPAN class="operator token">=</SPAN> params<SPAN class="punctuation token">,</SPAN> verify<SPAN class="operator token">=</SPAN><SPAN class="token boolean">False</SPAN><SPAN class="punctuation token">)</SPAN>
response <SPAN class="operator token">=</SPAN> json<SPAN class="punctuation token">.</SPAN>loads<SPAN class="punctuation token">(</SPAN>r<SPAN class="punctuation token">.</SPAN>content<SPAN class="punctuation token">)</SPAN>
itemID <SPAN class="operator token">=</SPAN> str<SPAN class="punctuation token">(</SPAN>response<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'item'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">'itemID'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># Upload Parts of video to Registered Item</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">addPart</SPAN><SPAN class="punctuation token">(</SPAN>itemID<SPAN class="punctuation token">,</SPAN> token<SPAN class="punctuation token">,</SPAN> filename<SPAN class="punctuation token">,</SPAN> num<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">'''Add part of the input video using a post request through the request module'''</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Adding parts of video"</SPAN><SPAN class="punctuation token">)</SPAN>
addpartURL <SPAN class="operator token">=</SPAN> <SPAN class="string token"><SPAN>'</SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=https%3A%2F%2Fservices2.arcgis.com%2Fo9a0D2ZwwG8CDFVQ%2Farcgis%2Frest%2Fservices%2FSewers%2FFeatureServer%2Fuploads%2F" target="_blank">https://services2.arcgis.com/o9a0D2ZwwG8CDFVQ/arcgis/rest/services/Sewers/FeatureServer/uploads/</A><SPAN>'</SPAN></SPAN> <SPAN class="operator token">+</SPAN> itemID <SPAN class="operator token">+</SPAN> <SPAN class="string token">'/uploadPart'</SPAN>
params <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="string token">'token'</SPAN><SPAN class="punctuation token">:</SPAN>token<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'f'</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="string token">'pjson'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'partNumber'</SPAN><SPAN class="punctuation token">:</SPAN> str<SPAN class="punctuation token">(</SPAN>num<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">}</SPAN>
image <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="string token">'partFile'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="punctuation token">(</SPAN>os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>basename<SPAN class="punctuation token">(</SPAN>filename<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> open<SPAN class="punctuation token">(</SPAN>filename<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'rb'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'video/mp4'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">}</SPAN>
response <SPAN class="operator token">=</SPAN> requests<SPAN class="punctuation token">.</SPAN>post<SPAN class="punctuation token">(</SPAN>addpartURL<SPAN class="punctuation token">,</SPAN> data <SPAN class="operator token">=</SPAN> params<SPAN class="punctuation token">,</SPAN> files <SPAN class="operator token">=</SPAN> image<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>json<SPAN class="punctuation token">.</SPAN>loads<SPAN class="punctuation token">(</SPAN>response<SPAN class="punctuation token">.</SPAN>text<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># Walk through temp directory to get each video part</SPAN>
<SPAN class="keyword token">for</SPAN> a<SPAN class="punctuation token">,</SPAN> b<SPAN class="punctuation token">,</SPAN> c <SPAN class="keyword token">in</SPAN> os<SPAN class="punctuation token">.</SPAN>walk<SPAN class="punctuation token">(</SPAN>TempDir<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> name <SPAN class="keyword token">in</SPAN> c<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>name<SPAN class="punctuation token">)</SPAN>
index <SPAN class="operator token">=</SPAN> int<SPAN class="punctuation token">(</SPAN>name<SPAN class="punctuation token">.</SPAN>replace<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'output'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">''</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>replace<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'.mp4'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">''</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
addPart<SPAN class="punctuation token">(</SPAN>itemID<SPAN class="punctuation token">,</SPAN> token<SPAN class="punctuation token">,</SPAN> os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>TempDir<SPAN class="punctuation token">,</SPAN>name<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> index<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># Commit upload</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Commiting upload"</SPAN><SPAN class="punctuation token">)</SPAN>
commitURL <SPAN class="operator token">=</SPAN> <SPAN class="string token"><SPAN>'</SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=https%3A%2F%2Fservices2.arcgis.com%2Fo9a0D2ZwwG8CDFVQ%2Farcgis%2Frest%2Fservices%2FSewers%2FFeatureServer%2Fuploads%2F" target="_blank">https://services2.arcgis.com/o9a0D2ZwwG8CDFVQ/arcgis/rest/services/Sewers/FeatureServer/uploads/</A><SPAN>'</SPAN></SPAN> <SPAN class="operator token">+</SPAN> itemID <SPAN class="operator token">+</SPAN> <SPAN class="string token">'/commit'</SPAN>
params <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="string token">'f'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'pjson'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'token'</SPAN><SPAN class="punctuation token">:</SPAN> token<SPAN class="punctuation token">}</SPAN>
response <SPAN class="operator token">=</SPAN> requests<SPAN class="punctuation token">.</SPAN>post<SPAN class="punctuation token">(</SPAN>commitURL<SPAN class="punctuation token">,</SPAN> data <SPAN class="operator token">=</SPAN> params<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>json<SPAN class="punctuation token">.</SPAN>loads<SPAN class="punctuation token">(</SPAN>response<SPAN class="punctuation token">.</SPAN>text<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># Add attachment to feature</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Adding attachment to feature"</SPAN><SPAN class="punctuation token">)</SPAN>
fsURL <SPAN class="operator token">=</SPAN> <SPAN class="string token"><SPAN>'</SPAN><A class="jive-link-external-small" href="https://community.esri.com/external-link.jspa?url=https%3A%2F%2Fservices2.arcgis.com%2Fo9a0D2ZwwG8CDFVQ%2FArcGIS%2Frest%2Fservices%2FSewers%2FFeatureServer%2F0%2F" target="_blank">https://services2.arcgis.com/o9a0D2ZwwG8CDFVQ/ArcGIS/rest/services/Sewers/FeatureServer/0/</A><SPAN>'</SPAN></SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>id<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> <SPAN class="string token">'/addAttachment'</SPAN>
params <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="string token">'f'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'pjson'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'token'</SPAN><SPAN class="punctuation token">:</SPAN> token<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'uploadId'</SPAN><SPAN class="punctuation token">:</SPAN> itemID<SPAN class="punctuation token">}</SPAN>
response <SPAN class="operator token">=</SPAN> requests<SPAN class="punctuation token">.</SPAN>post<SPAN class="punctuation token">(</SPAN>fsURL<SPAN class="punctuation token">,</SPAN> data <SPAN class="operator token">=</SPAN> params<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>response<SPAN class="punctuation token">.</SPAN>content<SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>