Hi Malith, Using the latest Chrome/Firefox versions. This isn't working when called from a java-client either.
Catch here is, rest of the form data get submitted correctly. AFAIU problem is in the way the file is streamed to the server (the way it gets attached to the request). Thanks, Supun On Fri, Apr 24, 2015 at 9:14 AM, Malith Munasinghe <[email protected]> wrote: > Hi Supun, > > Can you check the browser version of yours ? As of [1] FormData emulation > for older browser (Below Safari 5 / Firefox 4) you might have to change it > to the way mentioned in top Ranked answer. > > [1] > http://stackoverflow.com/questions/5392344/sending-multipart-formdata-with-jquery-ajax > > On Fri, Apr 24, 2015 at 9:02 AM, Supun Sethunga <[email protected]> wrote: > >> Hi Malith/Thilini, >> >> Thanks for the suggestion. I had tried that. Didn't work :/ >> >> Regards, >> Supun >> >> On Fri, Apr 24, 2015 at 8:45 AM, Thilini Cooray <[email protected]> >> wrote: >> >>> Hi Supun, >>> >>> [1] also suggests to make contentType false. >>> >>> [1] >>> http://stackoverflow.com/questions/12831680/jquery-ajax-multipart-form-data-not-sending-data >>> >>> Thanks. >>> >>> On Fri, Apr 24, 2015 at 8:44 AM, Malith Munasinghe <[email protected]> >>> wrote: >>> >>>> Hi Supun! >>>> >>>> Try Making contentType: false, >>>> >>>> Regards, >>>> Malith. >>>> >>>> On Thu, Apr 23, 2015 at 5:20 PM, Supun Sethunga <[email protected]> >>>> wrote: >>>> >>>>> Hi, >>>>> >>>>> Requirement was to let a user upload a data file from a UI >>>>> (html/jaggery), and the backend which handles file uploading is exposed as >>>>> a REST service. Backend service method I wrote looks as follows: >>>>> >>>>> @POST >>>>>> @Produces(MediaType.APPLICATION_JSON) >>>>>> @Consumes(MediaType.MULTIPART_FORM_DATA) >>>>>> public Response uploadDataset(@Multipart("datasetName") String >>>>>> datasetName, >>>>>> @Multipart("version") String >>>>>> version, >>>>>> @Multipart("description") String >>>>>> description, >>>>>> @Multipart("sourceType") String >>>>>> sourceType, >>>>>> @Multipart("destination") String >>>>>> destination, >>>>>> @Multipart("sourcePath") String >>>>>> sourcePath, >>>>>> @Multipart("dataFormat") String >>>>>> dataFormat, >>>>>> @Multipart("file") InputStream >>>>>> inputStream) { >>>>>> . . . >>>>>> . . . >>>>>> } >>>>> >>>>> >>>>> The InputStream is then written to a file at the server side. This >>>>> method works fine when I call this with CURL using: >>>>> >>>>> *curl -X POST -b cookies http://localhost:9763/api/datasets >>>>>> <http://localhost:9763/api/datasets> -H "Authorization: Basic >>>>>> YWRtaW46YWRtaW4=" -H "Content-Type: multipart/form-data" --form >>>>>> datasetName=TestDataset --form version=1.0.0 --form >>>>>> description=TestDescription --form sourceType=file --form >>>>>> destination=file >>>>>> --form dataFormat=CSV --form >>>>>> file=@/home/supun/Supun/MachineLearning/data/IndiansDiabetes.csv --form >>>>>> sourcePath=/temp* >>>>> >>>>> >>>>> Also works fine when I used Chrome's REST client. >>>>> >>>>> However, when I call the same service, using AJAX, the file is >>>>> written with empty content. Follow is the sample snippet. >>>>> >>>>> >>>>>> *var formData = new FormData();* >>>>>> * formData.append("file", fileInput[0]['files'][0], >>>>>> 'IndiansDiabetes.csv');* >>>>>> * formData.append("datasetName", name);* >>>>>> * formData.append("version", version);* >>>>>> * formData.append("description", comments);* >>>>>> * formData.append("sourceType", dataSourceType);* >>>>>> * formData.append("sourcePath", null);* >>>>>> * formData.append("destination", dataTargetType);** >>>>>> formData.append("dataFormat", dataType);* >>>>> >>>>> >>>>> >>>>> >>>>>> * var baseUrl = getBaseUrl(window.location.href);* >>>>>> * $.ajax({* >>>>>> * type: 'POST',* >>>>>> * url: baseUrl + '/api/datasets', * >>>>>> * contentType: "multipart/form-data",* >>>>>> * processData: false,* >>>>>> * data: formData,** beforeSend : function(xhr) {* >>>>>> >>>>>> * xhr.setRequestHeader("Authorization", "Basic " + >>>>>> "YWRtaW46YWRtaW4=");* >>>>>> * },* >>>>>> * success : function(res){* >>>>>> * console.log('success');* >>>>>> * },* >>>>>> * error : function(res){* >>>>>> * console.log('failed');* >>>>>> * } * >>>>>> * });** })* >>>>> >>>>> >>>>> One thing I noticed was, When calling the service using CURL and >>>>> REST-Client, the *@Multipart("file") InputStream inputStream* binds >>>>> to a "LoadingByteArrayOutputStream", but when calling from AJAX (or even >>>>> with a java client) it binds to a >>>>> "org.apache.cxf.attachment.DelegatingInputStream", and hence writing an >>>>> empty content to the server. >>>>> >>>>> Any idea on how to overcome this? >>>>> >>>>> Thanks, >>>>> Supun >>>>> >>>>> -- >>>>> *Supun Sethunga* >>>>> Software Engineer >>>>> WSO2, Inc. >>>>> http://wso2.com/ >>>>> lean | enterprise | middleware >>>>> Mobile : +94 716546324 >>>>> >>>>> _______________________________________________ >>>>> Dev mailing list >>>>> [email protected] >>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev >>>>> >>>>> >>>> >>>> >>>> -- >>>> Malith Munasinghe | Software Engineer >>>> M: +94 (071) 9401122 >>>> E: [email protected] >>>> W: http://wso2.com >>>> >>>> _______________________________________________ >>>> Dev mailing list >>>> [email protected] >>>> http://wso2.org/cgi-bin/mailman/listinfo/dev >>>> >>>> >>> >>> >>> -- >>> Best Regards, >>> >>> *Thilini Cooray* >>> Software Engineer >>> Mobile : +94 (0) 774 570 112 <%2B94%20%280%29%20773%20451194> >>> E-mail : [email protected] >>> >>> WSO2 Inc. www.wso2.com >>> lean.enterprise.middleware >>> >> >> >> >> -- >> *Supun Sethunga* >> Software Engineer >> WSO2, Inc. >> http://wso2.com/ >> lean | enterprise | middleware >> Mobile : +94 716546324 >> > > > > -- > Malith Munasinghe | Software Engineer > M: +94 (071) 9401122 > E: [email protected] > W: http://wso2.com > -- *Supun Sethunga* Software Engineer WSO2, Inc. http://wso2.com/ lean | enterprise | middleware Mobile : +94 716546324
_______________________________________________ Dev mailing list [email protected] http://wso2.org/cgi-bin/mailman/listinfo/dev
