I am trying to do the pattern outlined in this post:
and the same post on geonet:
But I am stuck on step one upload sd file to the server with rest api.
Upload—ArcGIS REST API: Services Directory | ArcGIS for Developers
action = 'uploads/upload' url = "http://{}:{}/arcgis/admin".format(server, port) requestURL = url + "/{}".format(action) query_dict = { 'file': r'C:\xx\xx\xxx.sd', "token": token, "f": "json" } query_string = urllib.urlencode(query_dict) r = urllib.urlopen(requestURL, query_string) j = json.loads(r.read()) print j
The json output is:
{u'status': u'error', u'code': 500, u'messages': [u'This operation must be a multipart request.']}
I have also tried with requests without any luck:
token = get_token('user', 'password', 'server', '6080', 60) item = r'C:\xx\xx\xxx.sd' files = {'file': item} payload = {'f': 'json', 'token': token} url = 'http://server:6080/arcgis/admin/uploads/upload' resp = requests.post(url, files=files, data=payload, verify=False) # Use verify=False if you don't have a certificate to use json_data = resp.json()
If I look at the resp object in the debugger I see:
content = {"status":"error","messages":["No file is associated with the upload request."],"code":500}
How can I get this working?
I was also trying to upload a file, however a serverobjectextension-file (SOE) and with c#.
I finally found a solution:
- I had to add ContentType "application/x-zip-compressed" to the header of the file content.
- The file-Parameter had to be named "itemFile" instead of "file" !!!!!
The relevant code part:
using (FileStream stream = new FileStream(soePath, FileMode.Open))
using (HttpClient client = new HttpClient())
{
MultipartFormDataContent content = new MultipartFormDataContent();
content.Add(new StringContent("pjson"), "f");
content.Add(new StringContent(token), "token");
content.Add(new StreamContent(stream)
{
Headers =
{
ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-zip-compressed")
}
}
, "itemFile", soePath);
Task<HttpResponseMessage> task = client.PostAsync($"{Service}/admin/uploads/upload", content);
Hope that helps.
Thanks Felix!
What an annoying gotcha!
Hi, If it is possible can you please share your python script. I am trying to upload soe but not been able to do.