Hi Chris

Great, I actually forgot that
AttachmentDeserializer sets Threshold to 100K.

To be honest I'm not sure now why I can have a 400K flowing, but
it is great setting those properties helps.

Happy it is working for you now

Sergey

On 28/04/16 17:25, Chris Bud wrote:
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/




--
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Reply via email to