Hi Sergey, Added jaxrs:properties in bean definition for size, memory, and directory, appears to be resolved...
On Thu, Apr 28, 2016 at 11:53 AM, Sergey Beryozkin <[email protected]> wrote: > Hi Chris > > I don't have time to investigate this issue. You are seeing in your code > that InputStream is empty but that is obviously not StreamClosed issue > which you are referring to now. > > As I said I updated the local test code and was able to echo a 400K stream. > > if you do like me to look at it then please open a JIRA issue and attach a > Maven test project where I can have a Java client sending a 300+K byte[] to > a server asserting that the whole block has been received > > Thanks, Sergey > > On 28/04/16 16:48, Chris Bud wrote: > >> Hi Sergey, >> >> I was able to reproduce this issue locally in a standalone project. >> I'll tar the project and attach it, maybe you'll see something I'm doing >> wrong, hopefully. I try to post the file I attached earlier with curl >> but get IO exceptions (Stream Closed). >> >> curl --form "fileupload=@KML_Samples.kml" >> http://localhost:8080/file-service/file/save/somename >> >> *Log* >> name: somename >> Attachments size: 1 >> DataHandler: KML_Samples.kml >> DataHandler Content type: application/octet-stream >> DataHandler Content class: class >> org.apache.cxf.attachment.DelegatingInputStream >> Mark supported: false >> java.io.IOException: Stream Closed >> .... >> >> Thanks, really appreciate your help! >> >> On Wed, Apr 27, 2016 at 12:54 PM, Sergey Beryozkin <[email protected] >> <mailto:[email protected]>> wrote: >> >> Or even with curl >> >> Sergey >> >> On 27/04/16 17:50, Sergey Beryozkin wrote: >> >> Hi >> >> I tried to reproduce the issue locally and could not, I updated >> the >> local test to echo a 400K array and it worked fine. Not sure what >> is >> going on in your case, can it be that a client is disconnecting >> too early ? >> >> Can you try to try posting a large payload from a Java client, >> CXF or >> plain Apache HTTP Client and see if it works ? >> >> Cheers, Sergey >> >> >> On 27/04/16 12:11, Chris Bud wrote: >> >> Hi Sergey, >> >> OK that did it!! My mistake, I overlooked that. I notice >> the cxf logger >> still cuts off the file contents but when I spit out the >> input stream >> I see >> the entire file contents. >> >> Now, is this part of a known issue? Seems like something CXF >> does behind >> the scenes that's not reading the entire stream.. Do I have >> to parse the >> stream myself or is there internal cxf calls I can use like >> AttachmentBuilder? I have multiple methods for uploading >> different file >> types, with different parameters, ideally I won't have to >> parse each >> method >> individually. >> >> Thanks for everything!! >> Chris >> >> On Wed, Apr 27, 2016 at 6:44 AM, Sergey Beryozkin >> <[email protected] <mailto:[email protected]>> >> wrote: >> >> Hi >> >> Can you please remove @Multipart which is bound right >> now to InputStream >> (as I did suggest) and retry ? >> >> Cheers, Sergey >> >> On 27/04/16 11:35, Chris Bud wrote: >> >> Hi Sergey, >> >> Regarding the side note, I've tried many approaches, >> that was the last >> attempt before turning to the mailing list. I did try >> attachment.getObject() >> >> I get similar results when I changed my method to >> accept InputStream, I >> only read the first parameter. I'll attach files of >> the inbound >> message >> my service receives, and my firebug output. I >> changed my method as you >> suggested. >> >> @Consumes(MediaType.MULTIPART_FORM_DATA) >> @Produces(MediaType.APPLICATION_JSON) >> public Response saveFile( >> @PathParam("name") String name, >> @Multipart InputStream body, >> @HeaderParam("CUSTOM-uid") String >> username); >> ... >> >> public Response saveFile(String name, InputStream >> is, String username){ >> ... >> try{ >> logger.info <http://logger.info> <http://logger.info >> >> ("***************************************"); >> >> logger.info <http://logger.info> <http://logger.info >> >> ("***************************************"); >> >> >> logger.info <http://logger.info> >> <http://logger.info>("InputStream: " + >> is.available()); >> >> BufferedReader br = null; >> StringBuilder sb = new >> StringBuilder(); >> >> String line; >> try { >> >> br = new >> BufferedReader(new >> InputStreamReader(is)); >> while ((line = >> br.readLine()) != >> null) { >> >> sb.append(line); >> } >> >> } catch (IOException e) { >> >> e.printStackTrace(); >> } finally { >> if (br != null) { >> try { >> >> br.close(); >> } catch >> (IOException e) { >> >> e.printStackTrace(); >> } >> } >> } >> >> logger.info <http://logger.info> >> <http://logger.info>("Info: " + sb.toString()); >> >> logger.info <http://logger.info> <http://logger.info >> >> ("***************************************"); >> >> logger.info <http://logger.info> <http://logger.info >> >> ("***************************************"); >> >> >> Produces these logs >> 2016-04-27 05:29:11,308 [INFO] [http-nio-8080-exec-2] >> [example.com.web.rs.impl.FileServiceImpl] - >> *************************************** >> 2016-04-27 05:29:11,308 [INFO] [http-nio-8080-exec-2] >> [example.com.web.rs.impl.FileServiceImpl] - >> *************************************** >> 2016-04-27 05:29:11,308 [INFO] [http-nio-8080-exec-2] >> [example.com.web.rs.impl.FileServiceImpl] - >> InputStream: 4 >> 2016-04-27 05:29:11,309 [INFO] [http-nio-8080-exec-2] >> [example.com.web.rs.impl.FileServiceImpl] - Info: 3304 >> 2016-04-27 05:29:11,310 [INFO] [http-nio-8080-exec-2] >> [example.com.web.rs.impl.FileServiceImpl] - >> *************************************** >> 2016-04-27 05:29:11,310 [INFO] [http-nio-8080-exec-2] >> [example.com.web.rs.impl.FileServiceImpl] - >> *************************************** >> >> Thanks for you help! >> Chris >> >> On Tue, Apr 26, 2016 at 4:24 PM, Sergey Beryozkin >> <[email protected] <mailto:[email protected]> >> <mailto:[email protected] >> >> <mailto:[email protected]>>> wrote: >> >> Hi >> >> Can you please experiment with accepting it >> directly as >> InputStream: >> >> @Consumes(MediaType.MULTIPART_FORM_DATA) >> > @Produces(MediaType.APPLICATION_JSON) >> > public Response saveFile( >> > @PathParam(“name") String name, >> > InputStream body, >> > @HeaderParam("CUSTOM-uid") String >> username); >> >> If the whole body is indeed available then >> saving this InputStream >> will show the complete multipart request (with >> the part >> separators, >> etc) >> >> As a side note, >> > for(Attachment attachment : >> body.getAllAttachments()) { >> > … // how I get the input stream >> > is = >> attachment.getDataHandler().getInputStream(); >> >> instead you can do >> >> is = attachment.getObject(InputStream.class); >> or directly from the multipart body if a part >> id is known. >> >> Sergey >> >> >> On 26/04/16 19:20, Chris Bud wrote: >> >> Hi, >> >> I'm using CXF 3.0.3, uploading files to >> jaxrs service from my >> webapp. >> Small files upload fine but when I use >> files > 300KB they're >> empty on my >> server, in my case I'm uploading an XML >> document containing >> test >> info for >> my system. When I test for available >> bytes from the data >> handler's input >> stream, it's always empty. Not the case >> with small files, say >> 500B. >> Regardless of size, the service returns a >> success. >> >> My LoggingInInterceptor spits out a >> payload that is >> incomplete, >> but the >> POST in firebug shows the entire file >> contents. I feel like >> I'm >> missing >> some sort of config, I've read about MTOM >> but I don't think >> 300KB should be >> a problem.... What am I missing? Thanks >> for helping >> >> My service interface >> @POST >> @Path(“/save/{name}") >> @Consumes(MediaType.MULTIPART_FORM_DATA) >> @Produces(MediaType.APPLICATION_JSON) >> public Response saveFile( >> @PathParam(“name") String name, >> @Multipart MultipartBody body, >> @HeaderParam("CUSTOM-uid") String >> username); >> >> ... >> for(Attachment attachment : >> body.getAllAttachments()) { >> … // how I get the input stream >> is = >> attachment.getDataHandler().getInputStream(); >> >> Bean definition >> <jaxrs:server id=“wserver" address="/"> >> <jaxrs:serviceBeans> >> <bean class=“example.com.web.rs >> <http://example.com.web.rs> >> >> <http://example.com.web.rs>.impl.FileServiceImpl" >> /> >> ... >> </jaxrs:serviceBeans> >> <jaxrs:providers> >> <bean >> >> >> class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" /> >> </jaxrs:providers> >> <jaxrs:features> >> <ref bean="logger" /> >> </jaxrs:features> >> >> >> </jaxrs:server> >> >> >> >> >> >> -- >> Sergey Beryozkin >> >> Talend Community Coders >> http://coders.talend.com/ >> >> >> >> >> >> >> -- >> Sergey Beryozkin >> >> Talend Community Coders >> http://coders.talend.com/ >> >> >> > > -- > Sergey Beryozkin > > Talend Community Coders > http://coders.talend.com/ >
