Using v4.9 of JS API, trying to upload a KML or KMZ to a geoprocessing service that has uploads enabled.
Struggling on how to format my esriRequest:
Here is what I have:
esriRequest(
"https://mygisserver/arcgis/rest/services/Geoprocessing/UploadKML/GPServer/uploads/upload",
{
body: document.getElementById("uploadForm"),
method: 'post',
//useProxy:true,
responseType: 'json',
query:{'f':'json'},
//headers: {'Content-Type': 'multipart/form-data'},
headers:{'Content-Type':'application/x-www-form-urlencoded'}
}
I've tried a lot of different combinations of headers, my proxy is working, but I keep getting errors like
PROXY OFF
Unexpected token < in JSON at position x (where x is a number) with no headers
Error parsing multi-part request with multipart/form-data headers
Error performing upload operation with application/x-www-form-urlencoded headers
PROXY ON
Unable to load https://gisdev.eon.faa.gov/proxy/pr… an error in handleAs: transformation of response with any headers.
Any ideas here?
Turns out if I look at the response, the upload is working, it's just returning it in html instead of json.....
Sooo, how do I format esri request to make sure json is returned....
If I look at the request in my developer tab, it shows:
https://gis-dev.eon.faa.gov/arcgis/rest/services/Geoprocessing/UploadKML/GPServer/uploads/upload?f=json
UPDATE: I think esriRequest in 4.9 doesn't currently work for a geoprocessing service upload endpoint (it works in 3.x though). Adding query: {"f":"json"} to the esriRequest options appends the parameter to the url a la GET query parameters, even while it POSTs the form data (in my case the binary file). However, the geoprocessing service upload endpoint doesn't accept these GET parameters. So there are two ways to deal with it
1. Use responseType: xml in the esriRequest options and parse the resultant html page with regex.
2. I added <input type="hidden" name="f" value="json"/> to my form to shoehorn the parameter into the POST request
So my final form html looks like
<form enctype="multipart/form-data" method="post" id="uploadForm" ref="myelement">
<label>
<span class="btn btn-primary">
<span>Browse…</span>
<input type="file" name="file" id="file" accept=".kmz, .kml" @change="handleFile">
</span>
</label>
<input type="hidden" name="f" value="json"/>
</form>
and my final EsriRequest is
esriRequest("https://mygisserver/arcgis/rest/services/Geoprocessing/UploadKML/GPServer/uploads/upload",
{
body: dom.byId("uploadForm"),
responseType: 'json'
}).then(successHandler, errorHandler);
This was the ONLY way I could get the service to return JSON....
If anyone has solved this another way, please let me know, because it seems like a bug in the 4.x version of the API when communicating with this particular type of rest endpoint and uploading a file...