You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by acec acec <to...@yahoo.ca> on 2011/02/03 15:29:43 UTC

some questions about cxf rest uploading file

Hi, all
I am using the following code to upload a file. It works fine.

But I have several questions:
1) If I change body.getAllAttachments() ==> body.getAttachment(contentId),
What does mean "contentId"? In my junit code, How can I set that contentId?

2)Can I get original file name on server side? I tried dataHandler.getName(), but it return null.

3)In my junit code, when I add Part using (reqEntity.addPart("file1", fileBody)), how can I retrieve the name "file1" from my server side?

4)I never use MTOM, when I am using the following code to upload one PDF file, does is use base64?

Thanks a lot.

===============Server side coe===============================
@POST
@Path("/upload/book")
public void postBook(MultipartBody body) {
 try {
  System.out.println("start post");
  List<Attachment> attachments = body.getAllAttachments();
  DataHandler dataHandler = attachments.get(0).getDataHandler();
  InputStream inputStream = dataHandler.getInputStream();
  OutputStream outputStream = new FileOutputStream(new File("/tmp/new.pdf"));
  IOUtils.copy(inputStream, outputStream);
  inputStream.close();
  outputStream.close();
  System.out.println("end post");
} catch (Exception e) {
  System.out.println("Exception");
}
}

====================My Junit==========================
public class UploadClassTest {
  @Test
  public void uploadClass() throws ClientProtocolException, IOException {
   HttpClient httpClient = new DefaultHttpClient();
   HttpPost httpPost = new HttpPost("http://localhost:8080/spring_cxf_rest/rest/upload/book");

   FileBody fileBody = new FileBody(new File("/tmp/Citi.pdf"));

   MultipartEntity reqEntity = new MultipartEntity();
   reqEntity.addPart("file1", fileBody);

   httpPost.setEntity(reqEntity);

   httpClient.execute(httpPost);
 }
}



Re: some questions about cxf rest uploading file

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi -
may be Picture annotations needed to be adjusted a bit, but either way,
great you made it working :-)
cheers, Sergey

On Thu, Feb 3, 2011 at 7:11 PM, acec acec <to...@yahoo.ca> wrote:

> Hi, Sergey
>
> Now, Everything works fine.
>
> Thanks for your help.
>
>
> --- On Thu, 2/3/11, acec acec <to...@yahoo.ca> wrote:
>
> > From: acec acec <to...@yahoo.ca>
> > Subject: Re: some questions about cxf rest uploading file
> > To: users@cxf.apache.org
> > Received: Thursday, February 3, 2011, 1:56 PM
> > Thanks for your help.
> >
> > The following is my new code according to your suggestion,
> > but I still got error message.
> >
> > org.apache.cxf.interceptor.Fault: .Problem with writing the
> > request message, class : class example.cxf.Picture.
> >     at
> >
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:679)
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
> >     at
> >
> org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:615)
> >     at
> > org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:595)
> >     at
> > org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:323)
> >
> > --------------------
> > String address = "http://localhost:8080/spring_cxf_rest/rest/postPicture
> ";
> > JAXRSClientFactoryBean bean = new
> > JAXRSClientFactoryBean();
> > bean.setAddress(address);
> >
> bean.setProperties(Collections.singletonMap(org.apache.cxf.message.Message.MTOM_ENABLED,(Object)"true"));
> > WebClient client = bean.createWebClient();
> > client.type("multipart/related").accept("multipart/related");
> >
> > File uploadFile = new File("/tmp/Citi.pdf");
> > DataSource source = new FileDataSource(uploadFile);
> > DataHandler dataHandler = new DataHandler(source);
> >
> > Picture picture = new Picture(new Date(), "picture");
> > picture.setData(dataHandler);
> >
> > client.post(picture, Picture.class);
> > --------------------
> > --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com>
> > wrote:
> >
> > > From: Sergey Beryozkin <sb...@gmail.com>
> > > Subject: Re: some questions about cxf rest uploading
> > file
> > > To: users@cxf.apache.org
> > > Received: Thursday, February 3, 2011, 1:31 PM
> > > CXF 2.3.2 should give a better error
> > > message.
> > > You need to set multipart/related and also set the
> > > mtop-enabled property on
> > > the web client side.
> > >
> > > With a proxy you can use a CXF EndpointProperty
> > annotation,
> > > with WebClient
> > > you need to set it on the JAXRSClientFactoryBean and
> > then
> > > do
> > > createWebClient().
> > > Setting it on webClient.getRequestContext() should
> > also
> > > work.
> > >
> > > Would you consider looking at the jaxrs_attachments
> > demo
> > > [1] ?
> > >
> > > Registration is needed :
> > > [1] http://www.talend.com/resources/documentation.php#SF
> > >
> > > cheers, Sergey
> > >
> > > On Thu, Feb 3, 2011 at 6:23 PM, acec acec <to...@yahoo.ca>
> > > wrote:
> > >
> > > > Thanks a lot.
> > > >
> > > > I try to use XOP, the following is my code and
> > > configuration.
> > > >
> > > > In my junit code, I got the following error
> > message.
> > > >
> > >
> > ------------------------------------------------------
> > > > org.apache.cxf.interceptor.Fault: .Problem with
> > > writing the request
> > > > message, class : class example.cxf.Picture.
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:679)
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:615)
> > > >        at
> > > >
> > >
> > org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:595)
> > > >        at
> > >
> > org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:240)
> > > >        at
> > >
> > org.apache.cxf.jaxrs.client.WebClient.post(WebClient.java:249)
> > > >        at
> > > >
> > >
> > arden.example.cxf.CxfClientTest.postPicture(CxfClientTest.java:33)
> > > >        at
> > > sun.reflect.NativeMethodAccessorImpl.invoke0(Native
> > Method)
> > > >        at
> > > >
> > >
> >
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> > > >        at
> > > >
> > >
> >
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> > > >        at
> > > java.lang.reflect.Method.invoke(Method.java:597)
> > > >        at
> > > >
> > >
> >
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
> > > >        at
> > > >
> > >
> >
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> > > >        at
> > > >
> > >
> >
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
> > > >        at
> > > >
> > >
> >
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> > > >        at
> > > >
> > >
> >
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
> > > >        at
> > > >
> > >
> >
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
> > > >        at
> > >
> > org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
> > > >        at
> > >
> > org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
> > > >        at
> > >
> > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
> > > >        at
> > >
> > org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
> > > >        at
> > >
> > org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
> > > >        at
> > >
> > org.junit.runners.ParentRunner.run(ParentRunner.java:236)
> > > >        at
> > > >
> > >
> >
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
> > > >        at
> > > >
> > >
> >
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> > > >        at
> > > >
> > >
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> > > >        at
> > > >
> > >
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
> > > >        at
> > > >
> > >
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
> > > >        at
> > > >
> > >
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> > > > Caused by:
> > >
> > org.apache.cxf.jaxrs.client.ClientWebApplicationException:
> > > > .Problem with writing the request message, class
> > :
> > > class
> > > > example.cxf.Picture.
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:506)
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:406)
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:673)
> > > >        ... 28 more
> > > > Caused by: javax.ws.rs.WebApplicationException
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.getHandlerForObject(MultipartProvider.java:320)
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.createDataHandler(MultipartProvider.java:291)
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.convertToDataHandlers(MultipartProvider.java:246)
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:212)
> > > >        at
> > > >
> > >
> >
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
> > > >        ... 29 more
> > > >
> > > >
> > > >
> > > > -----------------------------------------
> > > > import javax.activation.DataHandler;
> > > > import javax.activation.DataSource;
> > > > import javax.activation.FileDataSource;
> > > > import javax.ws.rs.core.Response;
> > > >
> > > > public class CxfClientTest {
> > > >
> > > > @Test
> > > > public void postPicture() throws
> > FileNotFoundException
> > > {
> > > >  File uploadFile = new File("/tmp/Citi.pdf");
> > > >  DataSource source = new
> > > FileDataSource(uploadFile);
> > > >  DataHandler dataHandler = new
> > > DataHandler(source);
> > > >  Picture picture = new Picture(new Date(),
> > > "picture");
> > > >  picture.setData(dataHandler);
> > > >
> > > >  WebClient client = WebClient.create("
> > > > http://localhost:8080/spring_cxf_rest/rest/postPicture");
> > > >
> > >
> > client.type("multipart/mixed").accept("multipart/mixed");
> > > >
> > > >  Response response = client.post(picture);
> > > >  System.out.println(response.getStatus());
> > > > }
> > > > -----------------------------------------
> > > > <jaxrs:server id="restContainer"
> > address="/">
> > > >
> > > <jaxrs:serviceBeans>
> > > >
> > >         <ref bean="testService"/>
> > > >
> > > </jaxrs:serviceBeans>
> > > >
> > > <jaxrs:properties>
> > > >
> > > <entry key="mtom-enabled" value="true"/>
> > > >
> > > </jaxrs:properties>
> > > >        </jaxrs:server>
> > > > -------------------------------------------
> > > > @XmlType
> > > > public class Picture {
> > > >         private Date
> > > time;
> > > >        private String name;
> > > >
> > >    @XmlMimeType("application/octet-stream")
> > > >        private DataHandler data;
> > > >
> > > >
> > >
> > ===============================================================
> > > >
> > > >
> > > > --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com>
> > > wrote:
> > > >
> > > > > From: Sergey Beryozkin <sb...@gmail.com>
> > > > > Subject: Re: some questions about cxf rest
> > > uploading file
> > > > > To: users@cxf.apache.org
> > > > > Received: Thursday, February 3, 2011, 12:39
> > PM
> > > > > Hi
> > > > >
> > > > > On Thu, Feb 3, 2011 at 5:25 PM, acec acec
> > <to...@yahoo.ca>
> > > > > wrote:
> > > > >
> > > > > > Thanks a lot.
> > > > > > When I try the following Book class,
> > > everything is
> > > > > ok.
> > > > > > ----------------------
> > > > > > Book b =
> > > > >
> > >
> > multipartBody.getAttachment(partContentId).getObject(Book.class)
> > > > > >
> > > > > > @XmlRootElement(name = "book")
> > > > > > public class Book {
> > > > > >        private Date
> > > time;
> > > > > >        private String
> > > name;
> > > > > > ...
> > > > > > getter/setter
> > > > > > }
> > > > > >
> > > > >
> > > > > ok
> > > > >
> > > > >
> > > > > > ----------------------
> > > > > > But after I change Book class like the
> > > following, I
> > > > > got some error message.
> > > > > > public class Book {
> > > > > >        private Date
> > > time;
> > > > > >        private String
> > > name;
> > > > > >        private
> > > InputStream
> > > > > inputStream;
> > > > > > ...
> > > > > > Seems I can not include inputStream
> > into
> > > Book class,
> > > > > and I have to use
> > > > > > different contentId attach InputStream
> > > separately.
> > > > > >
> > > > > >
> > > > > If you XOP then you can include InputStream
> > > inside the
> > > > > Book...But you'd need
> > > > > to use WebClient for that to work :-)
> > > > >
> > > > > cheers, Sergey
> > > > >
> > > > >
> > > > >
> > > > > > Regards.
> > > > > >
> > > > > >
> > > > > > --- On Thu, 2/3/11, Sergey Beryozkin
> > <sb...@gmail.com>
> > > > > wrote:
> > > > > >
> > > > > > > From: Sergey Beryozkin <sb...@gmail.com>
> > > > > > > Subject: Re: some questions about
> > cxf
> > > rest
> > > > > uploading file
> > > > > > > To: users@cxf.apache.org
> > > > > > > Received: Thursday, February 3,
> > 2011,
> > > 11:41 AM
> > > > > > > > 2) According to cxf guide
> > "When
> > > > > > > handling complex
> > multipart/form-data
> > > > > > > >> submissions (such as
> > those
> > > containing
> > > > > files)
> > > > > > > MultipartBody (and Attachment)
> > > > > > > >> need to be used
> > directly."
> > > > > > > >>
> > > > > > > >> MultipartBody or
> > > List<Attachment>,
> > > > > provided
> > > > > > > it is a real
> > > > > > > > multipart/form-data
> > submission
> > > (with
> > > > > recursive parts)
> > > > > > > >
> > > > > > > >
> > > > > > > >> When I handle the above
> > form,
> > > I have to
> > > > > use
> > > > > > > MultipartBody, is there easy
> > > > > > > >> way to parse text input
> > and
> > > file input
> > > > > from
> > > > > > > MultipartBody?
> > > > > > > >>
> > > > > > > >>
> > > > > > > > Assuming the JAX-RS provider
> > is
> > > available
> > > > > which can
> > > > > > > handle the content of
> > > > > > > > the file then yes. Example,
> > if a
> > > given file
> > > > > represents
> > > > > > > a Book XML instance
> > > > > > > > then you can do
> > > > > > > >
> > > > > > > > Book b =
> > > > > > >
> > > > >
> > >
> > multipartBody.getAttachment(partContentId).getObject(Book.class)
> > > > > > > >
> > > > > > > > or
> > > > > > > >
> > > > > > > > Book b =
> > > > > > >
> > > multipartBody.getAttachmentObject(partContentId,
> > > > > > > Book.class)
> > > > > > > >
> > > > > > > >
> > > > > > > or if all the attachment parts
> > have the
> > > same
> > > > > content type
> > > > > > > then simply
> > > > > > >
> > > > > > > for (Attachment att :
> > > listofAttachments) {
> > > > > > >     Book b =
> > > > > att.getObject(Book.class);
> > > > > > > }
> > > > > > >
> > > > > > >
> > > > > > > > Cheers, Sergey
> > > > > > > >
> > > > > > > > Regards.
> > > > > > > >>
> > > > > > > >>
> > > > > > > >> --- On Thu, 2/3/11,
> > Sergey
> > > Beryozkin
> > > > > <sb...@gmail.com>
> > > > > > > wrote:
> > > > > > > >>
> > > > > > > >> > From: Sergey
> > Beryozkin
> > > <sb...@gmail.com>
> > > > > > > >> > Subject: Re: some
> > > questions about
> > > > > cxf rest
> > > > > > > uploading file
> > > > > > > >> > To: users@cxf.apache.org
> > > > > > > >> > Received: Thursday,
> > > February 3,
> > > > > 2011, 9:54
> > > > > > > AM
> > > > > > > >> > Hi
> > > > > > > >> >
> > > > > > > >> > On Thu, Feb 3, 2011
> > at
> > > 2:29 PM,
> > > > > acec acec
> > > > > > > <to...@yahoo.ca>
> > > > > > > >> > wrote:
> > > > > > > >> >
> > > > > > > >> > > Hi, all
> > > > > > > >> > > I am using the
> > > following code
> > > > > to upload
> > > > > > > a file. It
> > > > > > > >> > works fine.
> > > > > > > >> > >
> > > > > > > >> > > But I have
> > several
> > > questions:
> > > > > > > >> > > 1) If I change
> > > > > body.getAllAttachments()
> > > > > > > ==>
> > > > > > > >> >
> > > body.getAttachment(contentId),
> > > > > > > >> > > What does mean
> > > "contentId"? In
> > > > > my junit
> > > > > > > code, How can
> > > > > > > >> > I set that
> > contentId?
> > > > > > > >> > >
> > > > > > > >> > > Content-Id the
> > id of
> > > the
> > > > > individual
> > > > > > > multi-part; sure,
> > > > > > > >> > if you know the
> > > > > > > >> > contentId then you
> > can
> > > use
> > > > > > > >> >
> > > > > > > >> >
> > > body.getAttachment(contentId)
> > > > > > > >> >
> > > > > > > >> >
> > > > > > > >> > > 2)Can I get
> > original
> > > file name
> > > > > on server
> > > > > > > side? I
> > > > > > > >> > tried
> > > > > > > >> > >
> > > dataHandler.getName(), but it
> > > > > return
> > > > > > > null.
> > > > > > > >> > >
> > > > > > > >> > >
> > > > > > > >> > If it's a
> > > multipart/form-data then
> > > > > you can
> > > > > > > get a
> > > > > > > >> > ContentDisposition
> > > header
> > > > > > > >> > from the Attachment
> > and
> > > get the
> > > > > name;
> > > > > > > otherwise you can
> > > > > > > >> > just introduce a
> > > > > > > >> > custom header and
> > use it
> > > during the
> > > > > creation
> > > > > > > of the
> > > > > > > >> > individual part and
> > then
> > > > > > > >> > retrieve it from
> > > Attachment.
> > > > > > > >> >
> > > > > > > >> >
> > > > > > > >> > > 3)In my junit
> > code,
> > > when I add
> > > > > Part
> > > > > > > using
> > > > > > > >> >
> > > (reqEntity.addPart("file1",
> > > > > > > >> > > fileBody)), how
> > can
> > > I retrieve
> > > > > the name
> > > > > > > "file1" from
> > > > > > > >> > my server side?
> > > > > > > >> > >
> > > > > > > >> > > You're using
> > the the
> > > Apache
> > > > > Http Client,
> > > > > > > so I'm not
> > > > > > > >> > sure what exactly
> > it
> > > > > > > >> > produces. If it's a
> > > > > multipart/form-data
> > > > > > > request then on the
> > > > > > > >> > cxf side do
> > > > > > > >> >
> > > attachment.getContentDisposition()
> > > > > and get
> > > > > > > the file name
> > > > > > > >> >
> > > > > > > >> >
> > > > > > > >> > > 4)I never use
> > MTOM,
> > > when I am
> > > > > using the
> > > > > > > following code
> > > > > > > >> > to upload one PDF
> > > > > > > >> > > file, does is
> > use
> > > base64?
> > > > > > > >> > >
> > > > > > > >> > >
> > > > > > > >> > Not sure what
> > Apache
> > > HttpClient
> > > > > does there
> > > > > > > >> >
> > > > > > > >> > Cheers, Sergey
> > > > > > > >> >
> > > > > > > >> >
> > > > > > > >> > > Thanks a lot.
> > > > > > > >> > >
> > > > > > > >> > >
> > > ===============Server side
> > > > > > > >> >
> > > coe===============================
> > > > > > > >> > > @POST
> > > > > > > >> > >
> > > @Path("/upload/book")
> > > > > > > >> > > public void
> > > > > postBook(MultipartBody body)
> > > > > > > {
> > > > > > > >> > >  try {
> > > > > > > >> > >
> > > > > System.out.println("start post");
> > > > > > > >> > >
> > > List<Attachment>
> > > > > attachments
> > > > > > > =
> > > > > > > >> >
> > > body.getAllAttachments();
> > > > > > > >> > >  DataHandler
> > > dataHandler
> > > > > =
> > > > > > > >> >
> > > > > attachments.get(0).getDataHandler();
> > > > > > > >> > >  InputStream
> > > inputStream
> > > > > =
> > > > > > > >> >
> > > dataHandler.getInputStream();
> > > > > > > >> > >  OutputStream
> > > > > outputStream = new
> > > > > > > >> >
> > FileOutputStream(new
> > > > > > > >> > >
> > > File("/tmp/new.pdf"));
> > > > > > > >> > >
> > > > > IOUtils.copy(inputStream,
> > > > > > > outputStream);
> > > > > > > >> > >
> > > inputStream.close();
> > > > > > > >> > >
> > > outputStream.close();
> > > > > > > >> > >
> > > System.out.println("end
> > > > > post");
> > > > > > > >> > > } catch
> > (Exception
> > > e) {
> > > > > > > >> > >
> > > > > System.out.println("Exception");
> > > > > > > >> > > }
> > > > > > > >> > > }
> > > > > > > >> > >
> > > > > > > >> > >
> > > ====================My
> > > > > > > >> >
> > > Junit==========================
> > > > > > > >> > > public class
> > > UploadClassTest
> > > > > {
> > > > > > > >> > >  @Test
> > > > > > > >> > >  public void
> > > > > uploadClass() throws
> > > > > > > >> >
> > ClientProtocolException,
> > > > > IOException {
> > > > > > > >> >
> > > >   HttpClient
> > > > > httpClient =
> > > > > > > new
> > > > > > > >> >
> > DefaultHttpClient();
> > > > > > > >> >
> > > >   HttpPost
> > > > > httpPost = new
> > > > > > > HttpPost("
> > > > > > > >> > > http://localhost:8080/spring_cxf_rest/rest/upload/book
> ");
> > > > > > > >> > >
> > > > > > > >> >
> > > >   FileBody
> > > > > fileBody = new
> > > > > > > FileBody(new
> > > > > > > >> >
> > File("/tmp/Citi.pdf"));
> > > > > > > >> > >
> > > > > > > >> >
> > > > > >   MultipartEntity
> > > > > > > reqEntity = new
> > > > > > > >> > MultipartEntity();
> > > > > > > >> >
> > > > > > >
> > > >   reqEntity.addPart("file1",
> > > > > > > >> > fileBody);
> > > > > > > >> > >
> > > > > > > >> >
> > > > > > >
> > > > >
> > > >   httpPost.setEntity(reqEntity);
> > > > > > > >> > >
> > > > > > > >> >
> > > > > > >
> > > > >
> > > >   httpClient.execute(httpPost);
> > > > > > > >> > >  }
> > > > > > > >> > > }
> > > > > > > >> > >
> > > > > > > >> > >
> > > > > > > >> > >
> > > > > > > >> >
> > > > > > > >>
> > > > > > > >>
> > > > > > > >>
> > > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > >
> > > >
> > > >
> > >
> >
> >
> >
>
>
>

Re: some questions about cxf rest uploading file

Posted by acec acec <to...@yahoo.ca>.
Hi, Sergey

Now, Everything works fine. 

Thanks for your help.


--- On Thu, 2/3/11, acec acec <to...@yahoo.ca> wrote:

> From: acec acec <to...@yahoo.ca>
> Subject: Re: some questions about cxf rest uploading file
> To: users@cxf.apache.org
> Received: Thursday, February 3, 2011, 1:56 PM
> Thanks for your help.
> 
> The following is my new code according to your suggestion,
> but I still got error message.
> 
> org.apache.cxf.interceptor.Fault: .Problem with writing the
> request message, class : class example.cxf.Picture.
>     at
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:679)
>     at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
>     at
> org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:615)
>     at
> org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:595)
>     at
> org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:323)
> 
> --------------------
> String address = "http://localhost:8080/spring_cxf_rest/rest/postPicture";
> JAXRSClientFactoryBean bean = new
> JAXRSClientFactoryBean();
> bean.setAddress(address);
> bean.setProperties(Collections.singletonMap(org.apache.cxf.message.Message.MTOM_ENABLED,(Object)"true"));
> WebClient client = bean.createWebClient();
> client.type("multipart/related").accept("multipart/related");
> 
> File uploadFile = new File("/tmp/Citi.pdf");
> DataSource source = new FileDataSource(uploadFile);
> DataHandler dataHandler = new DataHandler(source);
> 
> Picture picture = new Picture(new Date(), "picture");
> picture.setData(dataHandler);
> 
> client.post(picture, Picture.class);
> --------------------
> --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com>
> wrote:
> 
> > From: Sergey Beryozkin <sb...@gmail.com>
> > Subject: Re: some questions about cxf rest uploading
> file
> > To: users@cxf.apache.org
> > Received: Thursday, February 3, 2011, 1:31 PM
> > CXF 2.3.2 should give a better error
> > message.
> > You need to set multipart/related and also set the
> > mtop-enabled property on
> > the web client side.
> > 
> > With a proxy you can use a CXF EndpointProperty
> annotation,
> > with WebClient
> > you need to set it on the JAXRSClientFactoryBean and
> then
> > do
> > createWebClient().
> > Setting it on webClient.getRequestContext() should
> also
> > work.
> > 
> > Would you consider looking at the jaxrs_attachments
> demo
> > [1] ?
> > 
> > Registration is needed :
> > [1] http://www.talend.com/resources/documentation.php#SF
> > 
> > cheers, Sergey
> > 
> > On Thu, Feb 3, 2011 at 6:23 PM, acec acec <to...@yahoo.ca>
> > wrote:
> > 
> > > Thanks a lot.
> > >
> > > I try to use XOP, the following is my code and
> > configuration.
> > >
> > > In my junit code, I got the following error
> message.
> > >
> >
> ------------------------------------------------------
> > > org.apache.cxf.interceptor.Fault: .Problem with
> > writing the request
> > > message, class : class example.cxf.Picture.
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:679)
> > >        at
> > >
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:615)
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:595)
> > >        at
> >
> org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:240)
> > >        at
> >
> org.apache.cxf.jaxrs.client.WebClient.post(WebClient.java:249)
> > >        at
> > >
> >
> arden.example.cxf.CxfClientTest.postPicture(CxfClientTest.java:33)
> > >        at
> > sun.reflect.NativeMethodAccessorImpl.invoke0(Native
> Method)
> > >        at
> > >
> >
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> > >        at
> > >
> >
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> > >        at
> > java.lang.reflect.Method.invoke(Method.java:597)
> > >        at
> > >
> >
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
> > >        at
> > >
> >
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> > >        at
> > >
> >
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
> > >        at
> > >
> >
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> > >        at
> > >
> >
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
> > >        at
> > >
> >
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
> > >        at
> >
> org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
> > >        at
> >
> org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
> > >        at
> >
> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
> > >        at
> >
> org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
> > >        at
> >
> org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
> > >        at
> >
> org.junit.runners.ParentRunner.run(ParentRunner.java:236)
> > >        at
> > >
> >
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
> > >        at
> > >
> >
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> > >        at
> > >
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> > >        at
> > >
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
> > >        at
> > >
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
> > >        at
> > >
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> > > Caused by:
> >
> org.apache.cxf.jaxrs.client.ClientWebApplicationException:
> > > .Problem with writing the request message, class
> :
> > class
> > > example.cxf.Picture.
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:506)
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:406)
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:673)
> > >        ... 28 more
> > > Caused by: javax.ws.rs.WebApplicationException
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.getHandlerForObject(MultipartProvider.java:320)
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.createDataHandler(MultipartProvider.java:291)
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.convertToDataHandlers(MultipartProvider.java:246)
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:212)
> > >        at
> > >
> >
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
> > >        ... 29 more
> > >
> > >
> > >
> > > -----------------------------------------
> > > import javax.activation.DataHandler;
> > > import javax.activation.DataSource;
> > > import javax.activation.FileDataSource;
> > > import javax.ws.rs.core.Response;
> > >
> > > public class CxfClientTest {
> > >
> > > @Test
> > > public void postPicture() throws
> FileNotFoundException
> > {
> > >  File uploadFile = new File("/tmp/Citi.pdf");
> > >  DataSource source = new
> > FileDataSource(uploadFile);
> > >  DataHandler dataHandler = new
> > DataHandler(source);
> > >  Picture picture = new Picture(new Date(),
> > "picture");
> > >  picture.setData(dataHandler);
> > >
> > >  WebClient client = WebClient.create("
> > > http://localhost:8080/spring_cxf_rest/rest/postPicture");
> > > 
> >
> client.type("multipart/mixed").accept("multipart/mixed");
> > >
> > >  Response response = client.post(picture);
> > >  System.out.println(response.getStatus());
> > > }
> > > -----------------------------------------
> > > <jaxrs:server id="restContainer"
> address="/">
> > >               
> > <jaxrs:serviceBeans>
> > >               
> >         <ref bean="testService"/>
> > >               
> > </jaxrs:serviceBeans>
> > >               
> > <jaxrs:properties>
> > >               
> > <entry key="mtom-enabled" value="true"/>
> > >               
> > </jaxrs:properties>
> > >        </jaxrs:server>
> > > -------------------------------------------
> > > @XmlType
> > > public class Picture {
> > >         private Date
> > time;
> > >        private String name;
> > >     
> >    @XmlMimeType("application/octet-stream")
> > >        private DataHandler data;
> > >
> > >
> >
> ===============================================================
> > >
> > >
> > > --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com>
> > wrote:
> > >
> > > > From: Sergey Beryozkin <sb...@gmail.com>
> > > > Subject: Re: some questions about cxf rest
> > uploading file
> > > > To: users@cxf.apache.org
> > > > Received: Thursday, February 3, 2011, 12:39
> PM
> > > > Hi
> > > >
> > > > On Thu, Feb 3, 2011 at 5:25 PM, acec acec
> <to...@yahoo.ca>
> > > > wrote:
> > > >
> > > > > Thanks a lot.
> > > > > When I try the following Book class,
> > everything is
> > > > ok.
> > > > > ----------------------
> > > > > Book b =
> > > >
> >
> multipartBody.getAttachment(partContentId).getObject(Book.class)
> > > > >
> > > > > @XmlRootElement(name = "book")
> > > > > public class Book {
> > > > >        private Date
> > time;
> > > > >        private String
> > name;
> > > > > ...
> > > > > getter/setter
> > > > > }
> > > > >
> > > >
> > > > ok
> > > >
> > > >
> > > > > ----------------------
> > > > > But after I change Book class like the
> > following, I
> > > > got some error message.
> > > > > public class Book {
> > > > >        private Date
> > time;
> > > > >        private String
> > name;
> > > > >        private
> > InputStream
> > > > inputStream;
> > > > > ...
> > > > > Seems I can not include inputStream
> into
> > Book class,
> > > > and I have to use
> > > > > different contentId attach InputStream
> > separately.
> > > > >
> > > > >
> > > > If you XOP then you can include InputStream
> > inside the
> > > > Book...But you'd need
> > > > to use WebClient for that to work :-)
> > > >
> > > > cheers, Sergey
> > > >
> > > >
> > > >
> > > > > Regards.
> > > > >
> > > > >
> > > > > --- On Thu, 2/3/11, Sergey Beryozkin
> <sb...@gmail.com>
> > > > wrote:
> > > > >
> > > > > > From: Sergey Beryozkin <sb...@gmail.com>
> > > > > > Subject: Re: some questions about
> cxf
> > rest
> > > > uploading file
> > > > > > To: users@cxf.apache.org
> > > > > > Received: Thursday, February 3,
> 2011,
> > 11:41 AM
> > > > > > > 2) According to cxf guide
> "When
> > > > > > handling complex
> multipart/form-data
> > > > > > >> submissions (such as
> those
> > containing
> > > > files)
> > > > > > MultipartBody (and Attachment)
> > > > > > >> need to be used
> directly."
> > > > > > >>
> > > > > > >> MultipartBody or
> > List<Attachment>,
> > > > provided
> > > > > > it is a real
> > > > > > > multipart/form-data
> submission
> > (with
> > > > recursive parts)
> > > > > > >
> > > > > > >
> > > > > > >> When I handle the above
> form,
> > I have to
> > > > use
> > > > > > MultipartBody, is there easy
> > > > > > >> way to parse text input
> and
> > file input
> > > > from
> > > > > > MultipartBody?
> > > > > > >>
> > > > > > >>
> > > > > > > Assuming the JAX-RS provider
> is
> > available
> > > > which can
> > > > > > handle the content of
> > > > > > > the file then yes. Example,
> if a
> > given file
> > > > represents
> > > > > > a Book XML instance
> > > > > > > then you can do
> > > > > > >
> > > > > > > Book b =
> > > > > >
> > > >
> >
> multipartBody.getAttachment(partContentId).getObject(Book.class)
> > > > > > >
> > > > > > > or
> > > > > > >
> > > > > > > Book b =
> > > > > >
> > multipartBody.getAttachmentObject(partContentId,
> > > > > > Book.class)
> > > > > > >
> > > > > > >
> > > > > > or if all the attachment parts
> have the
> > same
> > > > content type
> > > > > > then simply
> > > > > >
> > > > > > for (Attachment att :
> > listofAttachments) {
> > > > > >     Book b =
> > > > att.getObject(Book.class);
> > > > > > }
> > > > > >
> > > > > >
> > > > > > > Cheers, Sergey
> > > > > > >
> > > > > > > Regards.
> > > > > > >>
> > > > > > >>
> > > > > > >> --- On Thu, 2/3/11,
> Sergey
> > Beryozkin
> > > > <sb...@gmail.com>
> > > > > > wrote:
> > > > > > >>
> > > > > > >> > From: Sergey
> Beryozkin
> > <sb...@gmail.com>
> > > > > > >> > Subject: Re: some
> > questions about
> > > > cxf rest
> > > > > > uploading file
> > > > > > >> > To: users@cxf.apache.org
> > > > > > >> > Received: Thursday,
> > February 3,
> > > > 2011, 9:54
> > > > > > AM
> > > > > > >> > Hi
> > > > > > >> >
> > > > > > >> > On Thu, Feb 3, 2011
> at
> > 2:29 PM,
> > > > acec acec
> > > > > > <to...@yahoo.ca>
> > > > > > >> > wrote:
> > > > > > >> >
> > > > > > >> > > Hi, all
> > > > > > >> > > I am using the
> > following code
> > > > to upload
> > > > > > a file. It
> > > > > > >> > works fine.
> > > > > > >> > >
> > > > > > >> > > But I have
> several
> > questions:
> > > > > > >> > > 1) If I change
> > > > body.getAllAttachments()
> > > > > > ==>
> > > > > > >> >
> > body.getAttachment(contentId),
> > > > > > >> > > What does mean
> > "contentId"? In
> > > > my junit
> > > > > > code, How can
> > > > > > >> > I set that
> contentId?
> > > > > > >> > >
> > > > > > >> > > Content-Id the
> id of
> > the
> > > > individual
> > > > > > multi-part; sure,
> > > > > > >> > if you know the
> > > > > > >> > contentId then you
> can
> > use
> > > > > > >> >
> > > > > > >> >
> > body.getAttachment(contentId)
> > > > > > >> >
> > > > > > >> >
> > > > > > >> > > 2)Can I get
> original
> > file name
> > > > on server
> > > > > > side? I
> > > > > > >> > tried
> > > > > > >> > >
> > dataHandler.getName(), but it
> > > > return
> > > > > > null.
> > > > > > >> > >
> > > > > > >> > >
> > > > > > >> > If it's a
> > multipart/form-data then
> > > > you can
> > > > > > get a
> > > > > > >> > ContentDisposition
> > header
> > > > > > >> > from the Attachment
> and
> > get the
> > > > name;
> > > > > > otherwise you can
> > > > > > >> > just introduce a
> > > > > > >> > custom header and
> use it
> > during the
> > > > creation
> > > > > > of the
> > > > > > >> > individual part and
> then
> > > > > > >> > retrieve it from
> > Attachment.
> > > > > > >> >
> > > > > > >> >
> > > > > > >> > > 3)In my junit
> code,
> > when I add
> > > > Part
> > > > > > using
> > > > > > >> >
> > (reqEntity.addPart("file1",
> > > > > > >> > > fileBody)), how
> can
> > I retrieve
> > > > the name
> > > > > > "file1" from
> > > > > > >> > my server side?
> > > > > > >> > >
> > > > > > >> > > You're using
> the the
> > Apache
> > > > Http Client,
> > > > > > so I'm not
> > > > > > >> > sure what exactly
> it
> > > > > > >> > produces. If it's a
> > > > multipart/form-data
> > > > > > request then on the
> > > > > > >> > cxf side do
> > > > > > >> >
> > attachment.getContentDisposition()
> > > > and get
> > > > > > the file name
> > > > > > >> >
> > > > > > >> >
> > > > > > >> > > 4)I never use
> MTOM,
> > when I am
> > > > using the
> > > > > > following code
> > > > > > >> > to upload one PDF
> > > > > > >> > > file, does is
> use
> > base64?
> > > > > > >> > >
> > > > > > >> > >
> > > > > > >> > Not sure what
> Apache
> > HttpClient
> > > > does there
> > > > > > >> >
> > > > > > >> > Cheers, Sergey
> > > > > > >> >
> > > > > > >> >
> > > > > > >> > > Thanks a lot.
> > > > > > >> > >
> > > > > > >> > >
> > ===============Server side
> > > > > > >> >
> > coe===============================
> > > > > > >> > > @POST
> > > > > > >> > >
> > @Path("/upload/book")
> > > > > > >> > > public void
> > > > postBook(MultipartBody body)
> > > > > > {
> > > > > > >> > >  try {
> > > > > > >> > >
> > > > System.out.println("start post");
> > > > > > >> > > 
> > List<Attachment>
> > > > attachments
> > > > > > =
> > > > > > >> >
> > body.getAllAttachments();
> > > > > > >> > >  DataHandler
> > dataHandler
> > > > =
> > > > > > >> >
> > > > attachments.get(0).getDataHandler();
> > > > > > >> > >  InputStream
> > inputStream
> > > > =
> > > > > > >> >
> > dataHandler.getInputStream();
> > > > > > >> > >  OutputStream
> > > > outputStream = new
> > > > > > >> >
> FileOutputStream(new
> > > > > > >> > >
> > File("/tmp/new.pdf"));
> > > > > > >> > >
> > > > IOUtils.copy(inputStream,
> > > > > > outputStream);
> > > > > > >> > > 
> > inputStream.close();
> > > > > > >> > > 
> > outputStream.close();
> > > > > > >> > > 
> > System.out.println("end
> > > > post");
> > > > > > >> > > } catch
> (Exception
> > e) {
> > > > > > >> > >
> > > > System.out.println("Exception");
> > > > > > >> > > }
> > > > > > >> > > }
> > > > > > >> > >
> > > > > > >> > >
> > ====================My
> > > > > > >> >
> > Junit==========================
> > > > > > >> > > public class
> > UploadClassTest
> > > > {
> > > > > > >> > >  @Test
> > > > > > >> > >  public void
> > > > uploadClass() throws
> > > > > > >> >
> ClientProtocolException,
> > > > IOException {
> > > > > > >> >
> > >   HttpClient
> > > > httpClient =
> > > > > > new
> > > > > > >> >
> DefaultHttpClient();
> > > > > > >> >
> > >   HttpPost
> > > > httpPost = new
> > > > > > HttpPost("
> > > > > > >> > > http://localhost:8080/spring_cxf_rest/rest/upload/book");
> > > > > > >> > >
> > > > > > >> >
> > >   FileBody
> > > > fileBody = new
> > > > > > FileBody(new
> > > > > > >> >
> File("/tmp/Citi.pdf"));
> > > > > > >> > >
> > > > > > >> >
> > > > >   MultipartEntity
> > > > > > reqEntity = new
> > > > > > >> > MultipartEntity();
> > > > > > >> >
> > > > > >
> > >   reqEntity.addPart("file1",
> > > > > > >> > fileBody);
> > > > > > >> > >
> > > > > > >> >
> > > > > >
> > > >
> > >   httpPost.setEntity(reqEntity);
> > > > > > >> > >
> > > > > > >> >
> > > > > >
> > > >
> > >   httpClient.execute(httpPost);
> > > > > > >> > >  }
> > > > > > >> > > }
> > > > > > >> > >
> > > > > > >> > >
> > > > > > >> > >
> > > > > > >> >
> > > > > > >>
> > > > > > >>
> > > > > > >>
> > > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > >
> > >
> > >
> > 
> 
> 
> 



Re: some questions about cxf rest uploading file

Posted by acec acec <to...@yahoo.ca>.
Thanks for your help.

The following is my new code according to your suggestion, but I still got error message.

org.apache.cxf.interceptor.Fault: .Problem with writing the request message, class : class example.cxf.Picture.
	at org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:679)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
	at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:615)
	at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:595)
	at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:323)

--------------------
String address = "http://localhost:8080/spring_cxf_rest/rest/postPicture";
JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
bean.setAddress(address);
bean.setProperties(Collections.singletonMap(org.apache.cxf.message.Message.MTOM_ENABLED,(Object)"true"));
WebClient client = bean.createWebClient();
client.type("multipart/related").accept("multipart/related");

File uploadFile = new File("/tmp/Citi.pdf");
DataSource source = new FileDataSource(uploadFile);
DataHandler dataHandler = new DataHandler(source);

Picture picture = new Picture(new Date(), "picture");
picture.setData(dataHandler);

client.post(picture, Picture.class);
--------------------
--- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com> wrote:

> From: Sergey Beryozkin <sb...@gmail.com>
> Subject: Re: some questions about cxf rest uploading file
> To: users@cxf.apache.org
> Received: Thursday, February 3, 2011, 1:31 PM
> CXF 2.3.2 should give a better error
> message.
> You need to set multipart/related and also set the
> mtop-enabled property on
> the web client side.
> 
> With a proxy you can use a CXF EndpointProperty annotation,
> with WebClient
> you need to set it on the JAXRSClientFactoryBean and then
> do
> createWebClient().
> Setting it on webClient.getRequestContext() should also
> work.
> 
> Would you consider looking at the jaxrs_attachments demo
> [1] ?
> 
> Registration is needed :
> [1] http://www.talend.com/resources/documentation.php#SF
> 
> cheers, Sergey
> 
> On Thu, Feb 3, 2011 at 6:23 PM, acec acec <to...@yahoo.ca>
> wrote:
> 
> > Thanks a lot.
> >
> > I try to use XOP, the following is my code and
> configuration.
> >
> > In my junit code, I got the following error message.
> >
> ------------------------------------------------------
> > org.apache.cxf.interceptor.Fault: .Problem with
> writing the request
> > message, class : class example.cxf.Picture.
> >        at
> >
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:679)
> >        at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
> >        at
> >
> org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:615)
> >        at
> >
> org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:595)
> >        at
> org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:240)
> >        at
> org.apache.cxf.jaxrs.client.WebClient.post(WebClient.java:249)
> >        at
> >
> arden.example.cxf.CxfClientTest.postPicture(CxfClientTest.java:33)
> >        at
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >        at
> >
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >        at
> >
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >        at
> java.lang.reflect.Method.invoke(Method.java:597)
> >        at
> >
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
> >        at
> >
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> >        at
> >
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
> >        at
> >
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> >        at
> >
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
> >        at
> >
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
> >        at
> org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
> >        at
> org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
> >        at
> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
> >        at
> org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
> >        at
> org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
> >        at
> org.junit.runners.ParentRunner.run(ParentRunner.java:236)
> >        at
> >
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
> >        at
> >
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> >        at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> >        at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
> >        at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
> >        at
> >
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> > Caused by:
> org.apache.cxf.jaxrs.client.ClientWebApplicationException:
> > .Problem with writing the request message, class :
> class
> > example.cxf.Picture.
> >        at
> >
> org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:506)
> >        at
> >
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:406)
> >        at
> >
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:673)
> >        ... 28 more
> > Caused by: javax.ws.rs.WebApplicationException
> >        at
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.getHandlerForObject(MultipartProvider.java:320)
> >        at
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.createDataHandler(MultipartProvider.java:291)
> >        at
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.convertToDataHandlers(MultipartProvider.java:246)
> >        at
> >
> org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:212)
> >        at
> >
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
> >        ... 29 more
> >
> >
> >
> > -----------------------------------------
> > import javax.activation.DataHandler;
> > import javax.activation.DataSource;
> > import javax.activation.FileDataSource;
> > import javax.ws.rs.core.Response;
> >
> > public class CxfClientTest {
> >
> > @Test
> > public void postPicture() throws FileNotFoundException
> {
> >  File uploadFile = new File("/tmp/Citi.pdf");
> >  DataSource source = new
> FileDataSource(uploadFile);
> >  DataHandler dataHandler = new
> DataHandler(source);
> >  Picture picture = new Picture(new Date(),
> "picture");
> >  picture.setData(dataHandler);
> >
> >  WebClient client = WebClient.create("
> > http://localhost:8080/spring_cxf_rest/rest/postPicture");
> > 
> client.type("multipart/mixed").accept("multipart/mixed");
> >
> >  Response response = client.post(picture);
> >  System.out.println(response.getStatus());
> > }
> > -----------------------------------------
> > <jaxrs:server id="restContainer" address="/">
> >               
> <jaxrs:serviceBeans>
> >               
>         <ref bean="testService"/>
> >               
> </jaxrs:serviceBeans>
> >               
> <jaxrs:properties>
> >               
> <entry key="mtom-enabled" value="true"/>
> >               
> </jaxrs:properties>
> >        </jaxrs:server>
> > -------------------------------------------
> > @XmlType
> > public class Picture {
> >         private Date
> time;
> >        private String name;
> >     
>    @XmlMimeType("application/octet-stream")
> >        private DataHandler data;
> >
> >
> ===============================================================
> >
> >
> > --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com>
> wrote:
> >
> > > From: Sergey Beryozkin <sb...@gmail.com>
> > > Subject: Re: some questions about cxf rest
> uploading file
> > > To: users@cxf.apache.org
> > > Received: Thursday, February 3, 2011, 12:39 PM
> > > Hi
> > >
> > > On Thu, Feb 3, 2011 at 5:25 PM, acec acec <to...@yahoo.ca>
> > > wrote:
> > >
> > > > Thanks a lot.
> > > > When I try the following Book class,
> everything is
> > > ok.
> > > > ----------------------
> > > > Book b =
> > >
> multipartBody.getAttachment(partContentId).getObject(Book.class)
> > > >
> > > > @XmlRootElement(name = "book")
> > > > public class Book {
> > > >        private Date
> time;
> > > >        private String
> name;
> > > > ...
> > > > getter/setter
> > > > }
> > > >
> > >
> > > ok
> > >
> > >
> > > > ----------------------
> > > > But after I change Book class like the
> following, I
> > > got some error message.
> > > > public class Book {
> > > >        private Date
> time;
> > > >        private String
> name;
> > > >        private
> InputStream
> > > inputStream;
> > > > ...
> > > > Seems I can not include inputStream into
> Book class,
> > > and I have to use
> > > > different contentId attach InputStream
> separately.
> > > >
> > > >
> > > If you XOP then you can include InputStream
> inside the
> > > Book...But you'd need
> > > to use WebClient for that to work :-)
> > >
> > > cheers, Sergey
> > >
> > >
> > >
> > > > Regards.
> > > >
> > > >
> > > > --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com>
> > > wrote:
> > > >
> > > > > From: Sergey Beryozkin <sb...@gmail.com>
> > > > > Subject: Re: some questions about cxf
> rest
> > > uploading file
> > > > > To: users@cxf.apache.org
> > > > > Received: Thursday, February 3, 2011,
> 11:41 AM
> > > > > > 2) According to cxf guide "When
> > > > > handling complex multipart/form-data
> > > > > >> submissions (such as those
> containing
> > > files)
> > > > > MultipartBody (and Attachment)
> > > > > >> need to be used directly."
> > > > > >>
> > > > > >> MultipartBody or
> List<Attachment>,
> > > provided
> > > > > it is a real
> > > > > > multipart/form-data submission
> (with
> > > recursive parts)
> > > > > >
> > > > > >
> > > > > >> When I handle the above form,
> I have to
> > > use
> > > > > MultipartBody, is there easy
> > > > > >> way to parse text input and
> file input
> > > from
> > > > > MultipartBody?
> > > > > >>
> > > > > >>
> > > > > > Assuming the JAX-RS provider is
> available
> > > which can
> > > > > handle the content of
> > > > > > the file then yes. Example, if a
> given file
> > > represents
> > > > > a Book XML instance
> > > > > > then you can do
> > > > > >
> > > > > > Book b =
> > > > >
> > >
> multipartBody.getAttachment(partContentId).getObject(Book.class)
> > > > > >
> > > > > > or
> > > > > >
> > > > > > Book b =
> > > > >
> multipartBody.getAttachmentObject(partContentId,
> > > > > Book.class)
> > > > > >
> > > > > >
> > > > > or if all the attachment parts have the
> same
> > > content type
> > > > > then simply
> > > > >
> > > > > for (Attachment att :
> listofAttachments) {
> > > > >     Book b =
> > > att.getObject(Book.class);
> > > > > }
> > > > >
> > > > >
> > > > > > Cheers, Sergey
> > > > > >
> > > > > > Regards.
> > > > > >>
> > > > > >>
> > > > > >> --- On Thu, 2/3/11, Sergey
> Beryozkin
> > > <sb...@gmail.com>
> > > > > wrote:
> > > > > >>
> > > > > >> > From: Sergey Beryozkin
> <sb...@gmail.com>
> > > > > >> > Subject: Re: some
> questions about
> > > cxf rest
> > > > > uploading file
> > > > > >> > To: users@cxf.apache.org
> > > > > >> > Received: Thursday,
> February 3,
> > > 2011, 9:54
> > > > > AM
> > > > > >> > Hi
> > > > > >> >
> > > > > >> > On Thu, Feb 3, 2011 at
> 2:29 PM,
> > > acec acec
> > > > > <to...@yahoo.ca>
> > > > > >> > wrote:
> > > > > >> >
> > > > > >> > > Hi, all
> > > > > >> > > I am using the
> following code
> > > to upload
> > > > > a file. It
> > > > > >> > works fine.
> > > > > >> > >
> > > > > >> > > But I have several
> questions:
> > > > > >> > > 1) If I change
> > > body.getAllAttachments()
> > > > > ==>
> > > > > >> >
> body.getAttachment(contentId),
> > > > > >> > > What does mean
> "contentId"? In
> > > my junit
> > > > > code, How can
> > > > > >> > I set that contentId?
> > > > > >> > >
> > > > > >> > > Content-Id the id of
> the
> > > individual
> > > > > multi-part; sure,
> > > > > >> > if you know the
> > > > > >> > contentId then you can
> use
> > > > > >> >
> > > > > >> >
> body.getAttachment(contentId)
> > > > > >> >
> > > > > >> >
> > > > > >> > > 2)Can I get original
> file name
> > > on server
> > > > > side? I
> > > > > >> > tried
> > > > > >> > >
> dataHandler.getName(), but it
> > > return
> > > > > null.
> > > > > >> > >
> > > > > >> > >
> > > > > >> > If it's a
> multipart/form-data then
> > > you can
> > > > > get a
> > > > > >> > ContentDisposition
> header
> > > > > >> > from the Attachment and
> get the
> > > name;
> > > > > otherwise you can
> > > > > >> > just introduce a
> > > > > >> > custom header and use it
> during the
> > > creation
> > > > > of the
> > > > > >> > individual part and then
> > > > > >> > retrieve it from
> Attachment.
> > > > > >> >
> > > > > >> >
> > > > > >> > > 3)In my junit code,
> when I add
> > > Part
> > > > > using
> > > > > >> >
> (reqEntity.addPart("file1",
> > > > > >> > > fileBody)), how can
> I retrieve
> > > the name
> > > > > "file1" from
> > > > > >> > my server side?
> > > > > >> > >
> > > > > >> > > You're using the the
> Apache
> > > Http Client,
> > > > > so I'm not
> > > > > >> > sure what exactly it
> > > > > >> > produces. If it's a
> > > multipart/form-data
> > > > > request then on the
> > > > > >> > cxf side do
> > > > > >> >
> attachment.getContentDisposition()
> > > and get
> > > > > the file name
> > > > > >> >
> > > > > >> >
> > > > > >> > > 4)I never use MTOM,
> when I am
> > > using the
> > > > > following code
> > > > > >> > to upload one PDF
> > > > > >> > > file, does is use
> base64?
> > > > > >> > >
> > > > > >> > >
> > > > > >> > Not sure what Apache
> HttpClient
> > > does there
> > > > > >> >
> > > > > >> > Cheers, Sergey
> > > > > >> >
> > > > > >> >
> > > > > >> > > Thanks a lot.
> > > > > >> > >
> > > > > >> > >
> ===============Server side
> > > > > >> >
> coe===============================
> > > > > >> > > @POST
> > > > > >> > >
> @Path("/upload/book")
> > > > > >> > > public void
> > > postBook(MultipartBody body)
> > > > > {
> > > > > >> > >  try {
> > > > > >> > >
> > > System.out.println("start post");
> > > > > >> > > 
> List<Attachment>
> > > attachments
> > > > > =
> > > > > >> >
> body.getAllAttachments();
> > > > > >> > >  DataHandler
> dataHandler
> > > =
> > > > > >> >
> > > attachments.get(0).getDataHandler();
> > > > > >> > >  InputStream
> inputStream
> > > =
> > > > > >> >
> dataHandler.getInputStream();
> > > > > >> > >  OutputStream
> > > outputStream = new
> > > > > >> > FileOutputStream(new
> > > > > >> > >
> File("/tmp/new.pdf"));
> > > > > >> > >
> > > IOUtils.copy(inputStream,
> > > > > outputStream);
> > > > > >> > > 
> inputStream.close();
> > > > > >> > > 
> outputStream.close();
> > > > > >> > > 
> System.out.println("end
> > > post");
> > > > > >> > > } catch (Exception
> e) {
> > > > > >> > >
> > > System.out.println("Exception");
> > > > > >> > > }
> > > > > >> > > }
> > > > > >> > >
> > > > > >> > >
> ====================My
> > > > > >> >
> Junit==========================
> > > > > >> > > public class
> UploadClassTest
> > > {
> > > > > >> > >  @Test
> > > > > >> > >  public void
> > > uploadClass() throws
> > > > > >> > ClientProtocolException,
> > > IOException {
> > > > > >> >
> >   HttpClient
> > > httpClient =
> > > > > new
> > > > > >> > DefaultHttpClient();
> > > > > >> >
> >   HttpPost
> > > httpPost = new
> > > > > HttpPost("
> > > > > >> > > http://localhost:8080/spring_cxf_rest/rest/upload/book");
> > > > > >> > >
> > > > > >> >
> >   FileBody
> > > fileBody = new
> > > > > FileBody(new
> > > > > >> > File("/tmp/Citi.pdf"));
> > > > > >> > >
> > > > > >> >
> > > >   MultipartEntity
> > > > > reqEntity = new
> > > > > >> > MultipartEntity();
> > > > > >> >
> > > > >
> >   reqEntity.addPart("file1",
> > > > > >> > fileBody);
> > > > > >> > >
> > > > > >> >
> > > > >
> > >
> >   httpPost.setEntity(reqEntity);
> > > > > >> > >
> > > > > >> >
> > > > >
> > >
> >   httpClient.execute(httpPost);
> > > > > >> > >  }
> > > > > >> > > }
> > > > > >> > >
> > > > > >> > >
> > > > > >> > >
> > > > > >> >
> > > > > >>
> > > > > >>
> > > > > >>
> > > > > >
> > > > >
> > > >
> > > >
> > > >
> > >
> >
> >
> >
> 



Re: some questions about cxf rest uploading file

Posted by Sergey Beryozkin <sb...@gmail.com>.
CXF 2.3.2 should give a better error message.
You need to set multipart/related and also set the mtop-enabled property on
the web client side.

With a proxy you can use a CXF EndpointProperty annotation, with WebClient
you need to set it on the JAXRSClientFactoryBean and then do
createWebClient().
Setting it on webClient.getRequestContext() should also work.

Would you consider looking at the jaxrs_attachments demo [1] ?

Registration is needed :
[1] http://www.talend.com/resources/documentation.php#SF

cheers, Sergey

On Thu, Feb 3, 2011 at 6:23 PM, acec acec <to...@yahoo.ca> wrote:

> Thanks a lot.
>
> I try to use XOP, the following is my code and configuration.
>
> In my junit code, I got the following error message.
> ------------------------------------------------------
> org.apache.cxf.interceptor.Fault: .Problem with writing the request
> message, class : class example.cxf.Picture.
>        at
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:679)
>        at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
>        at
> org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:615)
>        at
> org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:595)
>        at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:240)
>        at org.apache.cxf.jaxrs.client.WebClient.post(WebClient.java:249)
>        at
> arden.example.cxf.CxfClientTest.postPicture(CxfClientTest.java:33)
>        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>        at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>        at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>        at java.lang.reflect.Method.invoke(Method.java:597)
>        at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
>        at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>        at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
>        at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>        at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
>        at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
>        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
>        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
>        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
>        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
>        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
>        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
>        at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
>        at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: org.apache.cxf.jaxrs.client.ClientWebApplicationException:
> .Problem with writing the request message, class : class
> example.cxf.Picture.
>        at
> org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:506)
>        at
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:406)
>        at
> org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:673)
>        ... 28 more
> Caused by: javax.ws.rs.WebApplicationException
>        at
> org.apache.cxf.jaxrs.provider.MultipartProvider.getHandlerForObject(MultipartProvider.java:320)
>        at
> org.apache.cxf.jaxrs.provider.MultipartProvider.createDataHandler(MultipartProvider.java:291)
>        at
> org.apache.cxf.jaxrs.provider.MultipartProvider.convertToDataHandlers(MultipartProvider.java:246)
>        at
> org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:212)
>        at
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
>        ... 29 more
>
>
>
> -----------------------------------------
> import javax.activation.DataHandler;
> import javax.activation.DataSource;
> import javax.activation.FileDataSource;
> import javax.ws.rs.core.Response;
>
> public class CxfClientTest {
>
> @Test
> public void postPicture() throws FileNotFoundException {
>  File uploadFile = new File("/tmp/Citi.pdf");
>  DataSource source = new FileDataSource(uploadFile);
>  DataHandler dataHandler = new DataHandler(source);
>  Picture picture = new Picture(new Date(), "picture");
>  picture.setData(dataHandler);
>
>  WebClient client = WebClient.create("
> http://localhost:8080/spring_cxf_rest/rest/postPicture");
>  client.type("multipart/mixed").accept("multipart/mixed");
>
>  Response response = client.post(picture);
>  System.out.println(response.getStatus());
> }
> -----------------------------------------
> <jaxrs:server id="restContainer" address="/">
>                <jaxrs:serviceBeans>
>                        <ref bean="testService"/>
>                </jaxrs:serviceBeans>
>                <jaxrs:properties>
>                <entry key="mtom-enabled" value="true"/>
>                </jaxrs:properties>
>        </jaxrs:server>
> -------------------------------------------
> @XmlType
> public class Picture {
>         private Date time;
>        private String name;
>         @XmlMimeType("application/octet-stream")
>        private DataHandler data;
>
> ===============================================================
>
>
> --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com> wrote:
>
> > From: Sergey Beryozkin <sb...@gmail.com>
> > Subject: Re: some questions about cxf rest uploading file
> > To: users@cxf.apache.org
> > Received: Thursday, February 3, 2011, 12:39 PM
> > Hi
> >
> > On Thu, Feb 3, 2011 at 5:25 PM, acec acec <to...@yahoo.ca>
> > wrote:
> >
> > > Thanks a lot.
> > > When I try the following Book class, everything is
> > ok.
> > > ----------------------
> > > Book b =
> > multipartBody.getAttachment(partContentId).getObject(Book.class)
> > >
> > > @XmlRootElement(name = "book")
> > > public class Book {
> > >        private Date time;
> > >        private String name;
> > > ...
> > > getter/setter
> > > }
> > >
> >
> > ok
> >
> >
> > > ----------------------
> > > But after I change Book class like the following, I
> > got some error message.
> > > public class Book {
> > >        private Date time;
> > >        private String name;
> > >        private InputStream
> > inputStream;
> > > ...
> > > Seems I can not include inputStream into Book class,
> > and I have to use
> > > different contentId attach InputStream separately.
> > >
> > >
> > If you XOP then you can include InputStream inside the
> > Book...But you'd need
> > to use WebClient for that to work :-)
> >
> > cheers, Sergey
> >
> >
> >
> > > Regards.
> > >
> > >
> > > --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com>
> > wrote:
> > >
> > > > From: Sergey Beryozkin <sb...@gmail.com>
> > > > Subject: Re: some questions about cxf rest
> > uploading file
> > > > To: users@cxf.apache.org
> > > > Received: Thursday, February 3, 2011, 11:41 AM
> > > > > 2) According to cxf guide "When
> > > > handling complex multipart/form-data
> > > > >> submissions (such as those containing
> > files)
> > > > MultipartBody (and Attachment)
> > > > >> need to be used directly."
> > > > >>
> > > > >> MultipartBody or List<Attachment>,
> > provided
> > > > it is a real
> > > > > multipart/form-data submission (with
> > recursive parts)
> > > > >
> > > > >
> > > > >> When I handle the above form, I have to
> > use
> > > > MultipartBody, is there easy
> > > > >> way to parse text input and file input
> > from
> > > > MultipartBody?
> > > > >>
> > > > >>
> > > > > Assuming the JAX-RS provider is available
> > which can
> > > > handle the content of
> > > > > the file then yes. Example, if a given file
> > represents
> > > > a Book XML instance
> > > > > then you can do
> > > > >
> > > > > Book b =
> > > >
> > multipartBody.getAttachment(partContentId).getObject(Book.class)
> > > > >
> > > > > or
> > > > >
> > > > > Book b =
> > > > multipartBody.getAttachmentObject(partContentId,
> > > > Book.class)
> > > > >
> > > > >
> > > > or if all the attachment parts have the same
> > content type
> > > > then simply
> > > >
> > > > for (Attachment att : listofAttachments) {
> > > >     Book b =
> > att.getObject(Book.class);
> > > > }
> > > >
> > > >
> > > > > Cheers, Sergey
> > > > >
> > > > > Regards.
> > > > >>
> > > > >>
> > > > >> --- On Thu, 2/3/11, Sergey Beryozkin
> > <sb...@gmail.com>
> > > > wrote:
> > > > >>
> > > > >> > From: Sergey Beryozkin <sb...@gmail.com>
> > > > >> > Subject: Re: some questions about
> > cxf rest
> > > > uploading file
> > > > >> > To: users@cxf.apache.org
> > > > >> > Received: Thursday, February 3,
> > 2011, 9:54
> > > > AM
> > > > >> > Hi
> > > > >> >
> > > > >> > On Thu, Feb 3, 2011 at 2:29 PM,
> > acec acec
> > > > <to...@yahoo.ca>
> > > > >> > wrote:
> > > > >> >
> > > > >> > > Hi, all
> > > > >> > > I am using the following code
> > to upload
> > > > a file. It
> > > > >> > works fine.
> > > > >> > >
> > > > >> > > But I have several questions:
> > > > >> > > 1) If I change
> > body.getAllAttachments()
> > > > ==>
> > > > >> > body.getAttachment(contentId),
> > > > >> > > What does mean "contentId"? In
> > my junit
> > > > code, How can
> > > > >> > I set that contentId?
> > > > >> > >
> > > > >> > > Content-Id the id of the
> > individual
> > > > multi-part; sure,
> > > > >> > if you know the
> > > > >> > contentId then you can use
> > > > >> >
> > > > >> > body.getAttachment(contentId)
> > > > >> >
> > > > >> >
> > > > >> > > 2)Can I get original file name
> > on server
> > > > side? I
> > > > >> > tried
> > > > >> > > dataHandler.getName(), but it
> > return
> > > > null.
> > > > >> > >
> > > > >> > >
> > > > >> > If it's a multipart/form-data then
> > you can
> > > > get a
> > > > >> > ContentDisposition header
> > > > >> > from the Attachment and get the
> > name;
> > > > otherwise you can
> > > > >> > just introduce a
> > > > >> > custom header and use it during the
> > creation
> > > > of the
> > > > >> > individual part and then
> > > > >> > retrieve it from Attachment.
> > > > >> >
> > > > >> >
> > > > >> > > 3)In my junit code, when I add
> > Part
> > > > using
> > > > >> > (reqEntity.addPart("file1",
> > > > >> > > fileBody)), how can I retrieve
> > the name
> > > > "file1" from
> > > > >> > my server side?
> > > > >> > >
> > > > >> > > You're using the the Apache
> > Http Client,
> > > > so I'm not
> > > > >> > sure what exactly it
> > > > >> > produces. If it's a
> > multipart/form-data
> > > > request then on the
> > > > >> > cxf side do
> > > > >> > attachment.getContentDisposition()
> > and get
> > > > the file name
> > > > >> >
> > > > >> >
> > > > >> > > 4)I never use MTOM, when I am
> > using the
> > > > following code
> > > > >> > to upload one PDF
> > > > >> > > file, does is use base64?
> > > > >> > >
> > > > >> > >
> > > > >> > Not sure what Apache HttpClient
> > does there
> > > > >> >
> > > > >> > Cheers, Sergey
> > > > >> >
> > > > >> >
> > > > >> > > Thanks a lot.
> > > > >> > >
> > > > >> > > ===============Server side
> > > > >> > coe===============================
> > > > >> > > @POST
> > > > >> > > @Path("/upload/book")
> > > > >> > > public void
> > postBook(MultipartBody body)
> > > > {
> > > > >> > >  try {
> > > > >> > >
> > System.out.println("start post");
> > > > >> > >  List<Attachment>
> > attachments
> > > > =
> > > > >> > body.getAllAttachments();
> > > > >> > >  DataHandler dataHandler
> > =
> > > > >> >
> > attachments.get(0).getDataHandler();
> > > > >> > >  InputStream inputStream
> > =
> > > > >> > dataHandler.getInputStream();
> > > > >> > >  OutputStream
> > outputStream = new
> > > > >> > FileOutputStream(new
> > > > >> > > File("/tmp/new.pdf"));
> > > > >> > >
> > IOUtils.copy(inputStream,
> > > > outputStream);
> > > > >> > >  inputStream.close();
> > > > >> > >  outputStream.close();
> > > > >> > >  System.out.println("end
> > post");
> > > > >> > > } catch (Exception e) {
> > > > >> > >
> > System.out.println("Exception");
> > > > >> > > }
> > > > >> > > }
> > > > >> > >
> > > > >> > > ====================My
> > > > >> > Junit==========================
> > > > >> > > public class UploadClassTest
> > {
> > > > >> > >  @Test
> > > > >> > >  public void
> > uploadClass() throws
> > > > >> > ClientProtocolException,
> > IOException {
> > > > >> > >   HttpClient
> > httpClient =
> > > > new
> > > > >> > DefaultHttpClient();
> > > > >> > >   HttpPost
> > httpPost = new
> > > > HttpPost("
> > > > >> > > http://localhost:8080/spring_cxf_rest/rest/upload/book");
> > > > >> > >
> > > > >> > >   FileBody
> > fileBody = new
> > > > FileBody(new
> > > > >> > File("/tmp/Citi.pdf"));
> > > > >> > >
> > > > >> >
> > >   MultipartEntity
> > > > reqEntity = new
> > > > >> > MultipartEntity();
> > > > >> >
> > > > >   reqEntity.addPart("file1",
> > > > >> > fileBody);
> > > > >> > >
> > > > >> >
> > > >
> > >   httpPost.setEntity(reqEntity);
> > > > >> > >
> > > > >> >
> > > >
> > >   httpClient.execute(httpPost);
> > > > >> > >  }
> > > > >> > > }
> > > > >> > >
> > > > >> > >
> > > > >> > >
> > > > >> >
> > > > >>
> > > > >>
> > > > >>
> > > > >
> > > >
> > >
> > >
> > >
> >
>
>
>

Re: some questions about cxf rest uploading file

Posted by acec acec <to...@yahoo.ca>.
Thanks a lot.

I try to use XOP, the following is my code and configuration.

In my junit code, I got the following error message.
------------------------------------------------------
org.apache.cxf.interceptor.Fault: .Problem with writing the request message, class : class example.cxf.Picture.
	at org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:679)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
	at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:615)
	at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:595)
	at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:240)
	at org.apache.cxf.jaxrs.client.WebClient.post(WebClient.java:249)
	at arden.example.cxf.CxfClientTest.postPicture(CxfClientTest.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.cxf.jaxrs.client.ClientWebApplicationException: .Problem with writing the request message, class : class example.cxf.Picture.
	at org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:506)
	at org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:406)
	at org.apache.cxf.jaxrs.client.WebClient$BodyWriter.handleMessage(WebClient.java:673)
	... 28 more
Caused by: javax.ws.rs.WebApplicationException
	at org.apache.cxf.jaxrs.provider.MultipartProvider.getHandlerForObject(MultipartProvider.java:320)
	at org.apache.cxf.jaxrs.provider.MultipartProvider.createDataHandler(MultipartProvider.java:291)
	at org.apache.cxf.jaxrs.provider.MultipartProvider.convertToDataHandlers(MultipartProvider.java:246)
	at org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:212)
	at org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
	... 29 more



-----------------------------------------
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.ws.rs.core.Response;

public class CxfClientTest {

@Test
public void postPicture() throws FileNotFoundException {
 File uploadFile = new File("/tmp/Citi.pdf");
 DataSource source = new FileDataSource(uploadFile);
 DataHandler dataHandler = new DataHandler(source);
 Picture picture = new Picture(new Date(), "picture");
 picture.setData(dataHandler);

 WebClient client = WebClient.create("http://localhost:8080/spring_cxf_rest/rest/postPicture");
 client.type("multipart/mixed").accept("multipart/mixed");

 Response response = client.post(picture);
 System.out.println(response.getStatus());
}
-----------------------------------------
<jaxrs:server id="restContainer" address="/">
		<jaxrs:serviceBeans>
			<ref bean="testService"/>
		</jaxrs:serviceBeans>
		<jaxrs:properties>
        	<entry key="mtom-enabled" value="true"/>
		</jaxrs:properties>
	</jaxrs:server>
-------------------------------------------
@XmlType
public class Picture {
	private Date time;
	private String name;
	@XmlMimeType("application/octet-stream")
	private DataHandler data;

===============================================================


--- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com> wrote:

> From: Sergey Beryozkin <sb...@gmail.com>
> Subject: Re: some questions about cxf rest uploading file
> To: users@cxf.apache.org
> Received: Thursday, February 3, 2011, 12:39 PM
> Hi
> 
> On Thu, Feb 3, 2011 at 5:25 PM, acec acec <to...@yahoo.ca>
> wrote:
> 
> > Thanks a lot.
> > When I try the following Book class, everything is
> ok.
> > ----------------------
> > Book b =
> multipartBody.getAttachment(partContentId).getObject(Book.class)
> >
> > @XmlRootElement(name = "book")
> > public class Book {
> >        private Date time;
> >        private String name;
> > ...
> > getter/setter
> > }
> >
> 
> ok
> 
> 
> > ----------------------
> > But after I change Book class like the following, I
> got some error message.
> > public class Book {
> >        private Date time;
> >        private String name;
> >        private InputStream
> inputStream;
> > ...
> > Seems I can not include inputStream into Book class,
> and I have to use
> > different contentId attach InputStream separately.
> >
> >
> If you XOP then you can include InputStream inside the
> Book...But you'd need
> to use WebClient for that to work :-)
> 
> cheers, Sergey
> 
> 
> 
> > Regards.
> >
> >
> > --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com>
> wrote:
> >
> > > From: Sergey Beryozkin <sb...@gmail.com>
> > > Subject: Re: some questions about cxf rest
> uploading file
> > > To: users@cxf.apache.org
> > > Received: Thursday, February 3, 2011, 11:41 AM
> > > > 2) According to cxf guide "When
> > > handling complex multipart/form-data
> > > >> submissions (such as those containing
> files)
> > > MultipartBody (and Attachment)
> > > >> need to be used directly."
> > > >>
> > > >> MultipartBody or List<Attachment>,
> provided
> > > it is a real
> > > > multipart/form-data submission (with
> recursive parts)
> > > >
> > > >
> > > >> When I handle the above form, I have to
> use
> > > MultipartBody, is there easy
> > > >> way to parse text input and file input
> from
> > > MultipartBody?
> > > >>
> > > >>
> > > > Assuming the JAX-RS provider is available
> which can
> > > handle the content of
> > > > the file then yes. Example, if a given file
> represents
> > > a Book XML instance
> > > > then you can do
> > > >
> > > > Book b =
> > >
> multipartBody.getAttachment(partContentId).getObject(Book.class)
> > > >
> > > > or
> > > >
> > > > Book b =
> > > multipartBody.getAttachmentObject(partContentId,
> > > Book.class)
> > > >
> > > >
> > > or if all the attachment parts have the same
> content type
> > > then simply
> > >
> > > for (Attachment att : listofAttachments) {
> > >     Book b =
> att.getObject(Book.class);
> > > }
> > >
> > >
> > > > Cheers, Sergey
> > > >
> > > > Regards.
> > > >>
> > > >>
> > > >> --- On Thu, 2/3/11, Sergey Beryozkin
> <sb...@gmail.com>
> > > wrote:
> > > >>
> > > >> > From: Sergey Beryozkin <sb...@gmail.com>
> > > >> > Subject: Re: some questions about
> cxf rest
> > > uploading file
> > > >> > To: users@cxf.apache.org
> > > >> > Received: Thursday, February 3,
> 2011, 9:54
> > > AM
> > > >> > Hi
> > > >> >
> > > >> > On Thu, Feb 3, 2011 at 2:29 PM,
> acec acec
> > > <to...@yahoo.ca>
> > > >> > wrote:
> > > >> >
> > > >> > > Hi, all
> > > >> > > I am using the following code
> to upload
> > > a file. It
> > > >> > works fine.
> > > >> > >
> > > >> > > But I have several questions:
> > > >> > > 1) If I change
> body.getAllAttachments()
> > > ==>
> > > >> > body.getAttachment(contentId),
> > > >> > > What does mean "contentId"? In
> my junit
> > > code, How can
> > > >> > I set that contentId?
> > > >> > >
> > > >> > > Content-Id the id of the
> individual
> > > multi-part; sure,
> > > >> > if you know the
> > > >> > contentId then you can use
> > > >> >
> > > >> > body.getAttachment(contentId)
> > > >> >
> > > >> >
> > > >> > > 2)Can I get original file name
> on server
> > > side? I
> > > >> > tried
> > > >> > > dataHandler.getName(), but it
> return
> > > null.
> > > >> > >
> > > >> > >
> > > >> > If it's a multipart/form-data then
> you can
> > > get a
> > > >> > ContentDisposition header
> > > >> > from the Attachment and get the
> name;
> > > otherwise you can
> > > >> > just introduce a
> > > >> > custom header and use it during the
> creation
> > > of the
> > > >> > individual part and then
> > > >> > retrieve it from Attachment.
> > > >> >
> > > >> >
> > > >> > > 3)In my junit code, when I add
> Part
> > > using
> > > >> > (reqEntity.addPart("file1",
> > > >> > > fileBody)), how can I retrieve
> the name
> > > "file1" from
> > > >> > my server side?
> > > >> > >
> > > >> > > You're using the the Apache
> Http Client,
> > > so I'm not
> > > >> > sure what exactly it
> > > >> > produces. If it's a
> multipart/form-data
> > > request then on the
> > > >> > cxf side do
> > > >> > attachment.getContentDisposition()
> and get
> > > the file name
> > > >> >
> > > >> >
> > > >> > > 4)I never use MTOM, when I am
> using the
> > > following code
> > > >> > to upload one PDF
> > > >> > > file, does is use base64?
> > > >> > >
> > > >> > >
> > > >> > Not sure what Apache HttpClient
> does there
> > > >> >
> > > >> > Cheers, Sergey
> > > >> >
> > > >> >
> > > >> > > Thanks a lot.
> > > >> > >
> > > >> > > ===============Server side
> > > >> > coe===============================
> > > >> > > @POST
> > > >> > > @Path("/upload/book")
> > > >> > > public void
> postBook(MultipartBody body)
> > > {
> > > >> > >  try {
> > > >> > > 
> System.out.println("start post");
> > > >> > >  List<Attachment>
> attachments
> > > =
> > > >> > body.getAllAttachments();
> > > >> > >  DataHandler dataHandler
> =
> > > >> >
> attachments.get(0).getDataHandler();
> > > >> > >  InputStream inputStream
> =
> > > >> > dataHandler.getInputStream();
> > > >> > >  OutputStream
> outputStream = new
> > > >> > FileOutputStream(new
> > > >> > > File("/tmp/new.pdf"));
> > > >> > > 
> IOUtils.copy(inputStream,
> > > outputStream);
> > > >> > >  inputStream.close();
> > > >> > >  outputStream.close();
> > > >> > >  System.out.println("end
> post");
> > > >> > > } catch (Exception e) {
> > > >> > > 
> System.out.println("Exception");
> > > >> > > }
> > > >> > > }
> > > >> > >
> > > >> > > ====================My
> > > >> > Junit==========================
> > > >> > > public class UploadClassTest
> {
> > > >> > >  @Test
> > > >> > >  public void
> uploadClass() throws
> > > >> > ClientProtocolException,
> IOException {
> > > >> > >   HttpClient
> httpClient =
> > > new
> > > >> > DefaultHttpClient();
> > > >> > >   HttpPost
> httpPost = new
> > > HttpPost("
> > > >> > > http://localhost:8080/spring_cxf_rest/rest/upload/book");
> > > >> > >
> > > >> > >   FileBody
> fileBody = new
> > > FileBody(new
> > > >> > File("/tmp/Citi.pdf"));
> > > >> > >
> > > >> >
> >   MultipartEntity
> > > reqEntity = new
> > > >> > MultipartEntity();
> > > >> >
> > > >   reqEntity.addPart("file1",
> > > >> > fileBody);
> > > >> > >
> > > >> >
> > >
> >   httpPost.setEntity(reqEntity);
> > > >> > >
> > > >> >
> > >
> >   httpClient.execute(httpPost);
> > > >> > >  }
> > > >> > > }
> > > >> > >
> > > >> > >
> > > >> > >
> > > >> >
> > > >>
> > > >>
> > > >>
> > > >
> > >
> >
> >
> >
> 



Re: some questions about cxf rest uploading file

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi

On Thu, Feb 3, 2011 at 5:25 PM, acec acec <to...@yahoo.ca> wrote:

> Thanks a lot.
> When I try the following Book class, everything is ok.
> ----------------------
> Book b = multipartBody.getAttachment(partContentId).getObject(Book.class)
>
> @XmlRootElement(name = "book")
> public class Book {
>        private Date time;
>        private String name;
> ...
> getter/setter
> }
>

ok


> ----------------------
> But after I change Book class like the following, I got some error message.
> public class Book {
>        private Date time;
>        private String name;
>        private InputStream inputStream;
> ...
> Seems I can not include inputStream into Book class, and I have to use
> different contentId attach InputStream separately.
>
>
If you XOP then you can include InputStream inside the Book...But you'd need
to use WebClient for that to work :-)

cheers, Sergey



> Regards.
>
>
> --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com> wrote:
>
> > From: Sergey Beryozkin <sb...@gmail.com>
> > Subject: Re: some questions about cxf rest uploading file
> > To: users@cxf.apache.org
> > Received: Thursday, February 3, 2011, 11:41 AM
> > > 2) According to cxf guide "When
> > handling complex multipart/form-data
> > >> submissions (such as those containing files)
> > MultipartBody (and Attachment)
> > >> need to be used directly."
> > >>
> > >> MultipartBody or List<Attachment>, provided
> > it is a real
> > > multipart/form-data submission (with recursive parts)
> > >
> > >
> > >> When I handle the above form, I have to use
> > MultipartBody, is there easy
> > >> way to parse text input and file input from
> > MultipartBody?
> > >>
> > >>
> > > Assuming the JAX-RS provider is available which can
> > handle the content of
> > > the file then yes. Example, if a given file represents
> > a Book XML instance
> > > then you can do
> > >
> > > Book b =
> > multipartBody.getAttachment(partContentId).getObject(Book.class)
> > >
> > > or
> > >
> > > Book b =
> > multipartBody.getAttachmentObject(partContentId,
> > Book.class)
> > >
> > >
> > or if all the attachment parts have the same content type
> > then simply
> >
> > for (Attachment att : listofAttachments) {
> >     Book b = att.getObject(Book.class);
> > }
> >
> >
> > > Cheers, Sergey
> > >
> > > Regards.
> > >>
> > >>
> > >> --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com>
> > wrote:
> > >>
> > >> > From: Sergey Beryozkin <sb...@gmail.com>
> > >> > Subject: Re: some questions about cxf rest
> > uploading file
> > >> > To: users@cxf.apache.org
> > >> > Received: Thursday, February 3, 2011, 9:54
> > AM
> > >> > Hi
> > >> >
> > >> > On Thu, Feb 3, 2011 at 2:29 PM, acec acec
> > <to...@yahoo.ca>
> > >> > wrote:
> > >> >
> > >> > > Hi, all
> > >> > > I am using the following code to upload
> > a file. It
> > >> > works fine.
> > >> > >
> > >> > > But I have several questions:
> > >> > > 1) If I change body.getAllAttachments()
> > ==>
> > >> > body.getAttachment(contentId),
> > >> > > What does mean "contentId"? In my junit
> > code, How can
> > >> > I set that contentId?
> > >> > >
> > >> > > Content-Id the id of the individual
> > multi-part; sure,
> > >> > if you know the
> > >> > contentId then you can use
> > >> >
> > >> > body.getAttachment(contentId)
> > >> >
> > >> >
> > >> > > 2)Can I get original file name on server
> > side? I
> > >> > tried
> > >> > > dataHandler.getName(), but it return
> > null.
> > >> > >
> > >> > >
> > >> > If it's a multipart/form-data then you can
> > get a
> > >> > ContentDisposition header
> > >> > from the Attachment and get the name;
> > otherwise you can
> > >> > just introduce a
> > >> > custom header and use it during the creation
> > of the
> > >> > individual part and then
> > >> > retrieve it from Attachment.
> > >> >
> > >> >
> > >> > > 3)In my junit code, when I add Part
> > using
> > >> > (reqEntity.addPart("file1",
> > >> > > fileBody)), how can I retrieve the name
> > "file1" from
> > >> > my server side?
> > >> > >
> > >> > > You're using the the Apache Http Client,
> > so I'm not
> > >> > sure what exactly it
> > >> > produces. If it's a multipart/form-data
> > request then on the
> > >> > cxf side do
> > >> > attachment.getContentDisposition() and get
> > the file name
> > >> >
> > >> >
> > >> > > 4)I never use MTOM, when I am using the
> > following code
> > >> > to upload one PDF
> > >> > > file, does is use base64?
> > >> > >
> > >> > >
> > >> > Not sure what Apache HttpClient does there
> > >> >
> > >> > Cheers, Sergey
> > >> >
> > >> >
> > >> > > Thanks a lot.
> > >> > >
> > >> > > ===============Server side
> > >> > coe===============================
> > >> > > @POST
> > >> > > @Path("/upload/book")
> > >> > > public void postBook(MultipartBody body)
> > {
> > >> > >  try {
> > >> > >  System.out.println("start post");
> > >> > >  List<Attachment> attachments
> > =
> > >> > body.getAllAttachments();
> > >> > >  DataHandler dataHandler =
> > >> > attachments.get(0).getDataHandler();
> > >> > >  InputStream inputStream =
> > >> > dataHandler.getInputStream();
> > >> > >  OutputStream outputStream = new
> > >> > FileOutputStream(new
> > >> > > File("/tmp/new.pdf"));
> > >> > >  IOUtils.copy(inputStream,
> > outputStream);
> > >> > >  inputStream.close();
> > >> > >  outputStream.close();
> > >> > >  System.out.println("end post");
> > >> > > } catch (Exception e) {
> > >> > >  System.out.println("Exception");
> > >> > > }
> > >> > > }
> > >> > >
> > >> > > ====================My
> > >> > Junit==========================
> > >> > > public class UploadClassTest {
> > >> > >  @Test
> > >> > >  public void uploadClass() throws
> > >> > ClientProtocolException, IOException {
> > >> > >   HttpClient httpClient =
> > new
> > >> > DefaultHttpClient();
> > >> > >   HttpPost httpPost = new
> > HttpPost("
> > >> > > http://localhost:8080/spring_cxf_rest/rest/upload/book");
> > >> > >
> > >> > >   FileBody fileBody = new
> > FileBody(new
> > >> > File("/tmp/Citi.pdf"));
> > >> > >
> > >> > >   MultipartEntity
> > reqEntity = new
> > >> > MultipartEntity();
> > >> >
> > >   reqEntity.addPart("file1",
> > >> > fileBody);
> > >> > >
> > >> >
> > >   httpPost.setEntity(reqEntity);
> > >> > >
> > >> >
> > >   httpClient.execute(httpPost);
> > >> > >  }
> > >> > > }
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> > >>
> > >>
> > >
> >
>
>
>

Re: some questions about cxf rest uploading file

Posted by acec acec <to...@yahoo.ca>.
Thanks a lot.
When I try the following Book class, everything is ok.
----------------------
Book b = multipartBody.getAttachment(partContentId).getObject(Book.class)

@XmlRootElement(name = "book")
public class Book {
	private Date time;
	private String name;
...
getter/setter
}
----------------------
But after I change Book class like the following, I got some error message.
public class Book {
	private Date time;
	private String name;
	private InputStream inputStream;
...
Seems I can not include inputStream into Book class, and I have to use different contentId attach InputStream separately.

Regards.


--- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com> wrote:

> From: Sergey Beryozkin <sb...@gmail.com>
> Subject: Re: some questions about cxf rest uploading file
> To: users@cxf.apache.org
> Received: Thursday, February 3, 2011, 11:41 AM
> > 2) According to cxf guide "When
> handling complex multipart/form-data
> >> submissions (such as those containing files)
> MultipartBody (and Attachment)
> >> need to be used directly."
> >>
> >> MultipartBody or List<Attachment>, provided
> it is a real
> > multipart/form-data submission (with recursive parts)
> >
> >
> >> When I handle the above form, I have to use
> MultipartBody, is there easy
> >> way to parse text input and file input from
> MultipartBody?
> >>
> >>
> > Assuming the JAX-RS provider is available which can
> handle the content of
> > the file then yes. Example, if a given file represents
> a Book XML instance
> > then you can do
> >
> > Book b =
> multipartBody.getAttachment(partContentId).getObject(Book.class)
> >
> > or
> >
> > Book b =
> multipartBody.getAttachmentObject(partContentId,
> Book.class)
> >
> >
> or if all the attachment parts have the same content type
> then simply
> 
> for (Attachment att : listofAttachments) {
>     Book b = att.getObject(Book.class);
> }
> 
> 
> > Cheers, Sergey
> >
> > Regards.
> >>
> >>
> >> --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com>
> wrote:
> >>
> >> > From: Sergey Beryozkin <sb...@gmail.com>
> >> > Subject: Re: some questions about cxf rest
> uploading file
> >> > To: users@cxf.apache.org
> >> > Received: Thursday, February 3, 2011, 9:54
> AM
> >> > Hi
> >> >
> >> > On Thu, Feb 3, 2011 at 2:29 PM, acec acec
> <to...@yahoo.ca>
> >> > wrote:
> >> >
> >> > > Hi, all
> >> > > I am using the following code to upload
> a file. It
> >> > works fine.
> >> > >
> >> > > But I have several questions:
> >> > > 1) If I change body.getAllAttachments()
> ==>
> >> > body.getAttachment(contentId),
> >> > > What does mean "contentId"? In my junit
> code, How can
> >> > I set that contentId?
> >> > >
> >> > > Content-Id the id of the individual
> multi-part; sure,
> >> > if you know the
> >> > contentId then you can use
> >> >
> >> > body.getAttachment(contentId)
> >> >
> >> >
> >> > > 2)Can I get original file name on server
> side? I
> >> > tried
> >> > > dataHandler.getName(), but it return
> null.
> >> > >
> >> > >
> >> > If it's a multipart/form-data then you can
> get a
> >> > ContentDisposition header
> >> > from the Attachment and get the name;
> otherwise you can
> >> > just introduce a
> >> > custom header and use it during the creation
> of the
> >> > individual part and then
> >> > retrieve it from Attachment.
> >> >
> >> >
> >> > > 3)In my junit code, when I add Part
> using
> >> > (reqEntity.addPart("file1",
> >> > > fileBody)), how can I retrieve the name
> "file1" from
> >> > my server side?
> >> > >
> >> > > You're using the the Apache Http Client,
> so I'm not
> >> > sure what exactly it
> >> > produces. If it's a multipart/form-data
> request then on the
> >> > cxf side do
> >> > attachment.getContentDisposition() and get
> the file name
> >> >
> >> >
> >> > > 4)I never use MTOM, when I am using the
> following code
> >> > to upload one PDF
> >> > > file, does is use base64?
> >> > >
> >> > >
> >> > Not sure what Apache HttpClient does there
> >> >
> >> > Cheers, Sergey
> >> >
> >> >
> >> > > Thanks a lot.
> >> > >
> >> > > ===============Server side
> >> > coe===============================
> >> > > @POST
> >> > > @Path("/upload/book")
> >> > > public void postBook(MultipartBody body)
> {
> >> > >  try {
> >> > >  System.out.println("start post");
> >> > >  List<Attachment> attachments
> =
> >> > body.getAllAttachments();
> >> > >  DataHandler dataHandler =
> >> > attachments.get(0).getDataHandler();
> >> > >  InputStream inputStream =
> >> > dataHandler.getInputStream();
> >> > >  OutputStream outputStream = new
> >> > FileOutputStream(new
> >> > > File("/tmp/new.pdf"));
> >> > >  IOUtils.copy(inputStream,
> outputStream);
> >> > >  inputStream.close();
> >> > >  outputStream.close();
> >> > >  System.out.println("end post");
> >> > > } catch (Exception e) {
> >> > >  System.out.println("Exception");
> >> > > }
> >> > > }
> >> > >
> >> > > ====================My
> >> > Junit==========================
> >> > > public class UploadClassTest {
> >> > >  @Test
> >> > >  public void uploadClass() throws
> >> > ClientProtocolException, IOException {
> >> > >   HttpClient httpClient =
> new
> >> > DefaultHttpClient();
> >> > >   HttpPost httpPost = new
> HttpPost("
> >> > > http://localhost:8080/spring_cxf_rest/rest/upload/book");
> >> > >
> >> > >   FileBody fileBody = new
> FileBody(new
> >> > File("/tmp/Citi.pdf"));
> >> > >
> >> > >   MultipartEntity
> reqEntity = new
> >> > MultipartEntity();
> >> >
> >   reqEntity.addPart("file1",
> >> > fileBody);
> >> > >
> >> >
> >   httpPost.setEntity(reqEntity);
> >> > >
> >> >
> >   httpClient.execute(httpPost);
> >> > >  }
> >> > > }
> >> > >
> >> > >
> >> > >
> >> >
> >>
> >>
> >>
> >
> 



Re: some questions about cxf rest uploading file

Posted by Sergey Beryozkin <sb...@gmail.com>.
> 2) According to cxf guide "When handling complex multipart/form-data
>> submissions (such as those containing files) MultipartBody (and Attachment)
>> need to be used directly."
>>
>> MultipartBody or List<Attachment>, provided it is a real
> multipart/form-data submission (with recursive parts)
>
>
>> When I handle the above form, I have to use MultipartBody, is there easy
>> way to parse text input and file input from MultipartBody?
>>
>>
> Assuming the JAX-RS provider is available which can handle the content of
> the file then yes. Example, if a given file represents a Book XML instance
> then you can do
>
> Book b = multipartBody.getAttachment(partContentId).getObject(Book.class)
>
> or
>
> Book b = multipartBody.getAttachmentObject(partContentId, Book.class)
>
>
or if all the attachment parts have the same content type then simply

for (Attachment att : listofAttachments) {
    Book b = att.getObject(Book.class);
}


> Cheers, Sergey
>
> Regards.
>>
>>
>> --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com> wrote:
>>
>> > From: Sergey Beryozkin <sb...@gmail.com>
>> > Subject: Re: some questions about cxf rest uploading file
>> > To: users@cxf.apache.org
>> > Received: Thursday, February 3, 2011, 9:54 AM
>> > Hi
>> >
>> > On Thu, Feb 3, 2011 at 2:29 PM, acec acec <to...@yahoo.ca>
>> > wrote:
>> >
>> > > Hi, all
>> > > I am using the following code to upload a file. It
>> > works fine.
>> > >
>> > > But I have several questions:
>> > > 1) If I change body.getAllAttachments() ==>
>> > body.getAttachment(contentId),
>> > > What does mean "contentId"? In my junit code, How can
>> > I set that contentId?
>> > >
>> > > Content-Id the id of the individual multi-part; sure,
>> > if you know the
>> > contentId then you can use
>> >
>> > body.getAttachment(contentId)
>> >
>> >
>> > > 2)Can I get original file name on server side? I
>> > tried
>> > > dataHandler.getName(), but it return null.
>> > >
>> > >
>> > If it's a multipart/form-data then you can get a
>> > ContentDisposition header
>> > from the Attachment and get the name; otherwise you can
>> > just introduce a
>> > custom header and use it during the creation of the
>> > individual part and then
>> > retrieve it from Attachment.
>> >
>> >
>> > > 3)In my junit code, when I add Part using
>> > (reqEntity.addPart("file1",
>> > > fileBody)), how can I retrieve the name "file1" from
>> > my server side?
>> > >
>> > > You're using the the Apache Http Client, so I'm not
>> > sure what exactly it
>> > produces. If it's a multipart/form-data request then on the
>> > cxf side do
>> > attachment.getContentDisposition() and get the file name
>> >
>> >
>> > > 4)I never use MTOM, when I am using the following code
>> > to upload one PDF
>> > > file, does is use base64?
>> > >
>> > >
>> > Not sure what Apache HttpClient does there
>> >
>> > Cheers, Sergey
>> >
>> >
>> > > Thanks a lot.
>> > >
>> > > ===============Server side
>> > coe===============================
>> > > @POST
>> > > @Path("/upload/book")
>> > > public void postBook(MultipartBody body) {
>> > >  try {
>> > >  System.out.println("start post");
>> > >  List<Attachment> attachments =
>> > body.getAllAttachments();
>> > >  DataHandler dataHandler =
>> > attachments.get(0).getDataHandler();
>> > >  InputStream inputStream =
>> > dataHandler.getInputStream();
>> > >  OutputStream outputStream = new
>> > FileOutputStream(new
>> > > File("/tmp/new.pdf"));
>> > >  IOUtils.copy(inputStream, outputStream);
>> > >  inputStream.close();
>> > >  outputStream.close();
>> > >  System.out.println("end post");
>> > > } catch (Exception e) {
>> > >  System.out.println("Exception");
>> > > }
>> > > }
>> > >
>> > > ====================My
>> > Junit==========================
>> > > public class UploadClassTest {
>> > >  @Test
>> > >  public void uploadClass() throws
>> > ClientProtocolException, IOException {
>> > >   HttpClient httpClient = new
>> > DefaultHttpClient();
>> > >   HttpPost httpPost = new HttpPost("
>> > > http://localhost:8080/spring_cxf_rest/rest/upload/book");
>> > >
>> > >   FileBody fileBody = new FileBody(new
>> > File("/tmp/Citi.pdf"));
>> > >
>> > >   MultipartEntity reqEntity = new
>> > MultipartEntity();
>> > >   reqEntity.addPart("file1",
>> > fileBody);
>> > >
>> > >   httpPost.setEntity(reqEntity);
>> > >
>> > >   httpClient.execute(httpPost);
>> > >  }
>> > > }
>> > >
>> > >
>> > >
>> >
>>
>>
>>
>

Re: some questions about cxf rest uploading file

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi

On Thu, Feb 3, 2011 at 3:41 PM, acec acec <to...@yahoo.ca> wrote:

> Thanks.
>
> 1) If I use cxf WebClient, I can set contentId like the follwing:
>
> attachmentList.add(new Attachment("pdf1", "application/pdf", new
> FileInputStream(uploadFile)));
>
> If I use the the following form to upload the file, How can I contentId?
>
>  <form method="post" action="/spring_cxf_rest/rest/upload/book"
> enctype="multipart/form-data">
>  name: <input type="text" name="name"/><br/>
>  file: <input type="file" name="file"/><br/>
>  <input type="submit" value="Submit"/>
>  </form>
>
>
I'm not sure, the Conten-Id would be set somehow by the browser module, you
can use a tcpTrace or similar and capture the payload and see or add a cxf
logging feature to the jaxrs endpoint;


> 2) According to cxf guide "When handling complex multipart/form-data
> submissions (such as those containing files) MultipartBody (and Attachment)
> need to be used directly."
>
> MultipartBody or List<Attachment>, provided it is a real
multipart/form-data submission (with recursive parts)


> When I handle the above form, I have to use MultipartBody, is there easy
> way to parse text input and file input from MultipartBody?
>
>
Assuming the JAX-RS provider is available which can handle the content of
the file then yes. Example, if a given file represents a Book XML instance
then you can do

Book b = multipartBody.getAttachment(partContentId).getObject(Book.class)

or

Book b = multipartBody.getAttachmentObject(partContentId, Book.class)

Cheers, Sergey

Regards.
>
>
> --- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com> wrote:
>
> > From: Sergey Beryozkin <sb...@gmail.com>
> > Subject: Re: some questions about cxf rest uploading file
> > To: users@cxf.apache.org
> > Received: Thursday, February 3, 2011, 9:54 AM
> > Hi
> >
> > On Thu, Feb 3, 2011 at 2:29 PM, acec acec <to...@yahoo.ca>
> > wrote:
> >
> > > Hi, all
> > > I am using the following code to upload a file. It
> > works fine.
> > >
> > > But I have several questions:
> > > 1) If I change body.getAllAttachments() ==>
> > body.getAttachment(contentId),
> > > What does mean "contentId"? In my junit code, How can
> > I set that contentId?
> > >
> > > Content-Id the id of the individual multi-part; sure,
> > if you know the
> > contentId then you can use
> >
> > body.getAttachment(contentId)
> >
> >
> > > 2)Can I get original file name on server side? I
> > tried
> > > dataHandler.getName(), but it return null.
> > >
> > >
> > If it's a multipart/form-data then you can get a
> > ContentDisposition header
> > from the Attachment and get the name; otherwise you can
> > just introduce a
> > custom header and use it during the creation of the
> > individual part and then
> > retrieve it from Attachment.
> >
> >
> > > 3)In my junit code, when I add Part using
> > (reqEntity.addPart("file1",
> > > fileBody)), how can I retrieve the name "file1" from
> > my server side?
> > >
> > > You're using the the Apache Http Client, so I'm not
> > sure what exactly it
> > produces. If it's a multipart/form-data request then on the
> > cxf side do
> > attachment.getContentDisposition() and get the file name
> >
> >
> > > 4)I never use MTOM, when I am using the following code
> > to upload one PDF
> > > file, does is use base64?
> > >
> > >
> > Not sure what Apache HttpClient does there
> >
> > Cheers, Sergey
> >
> >
> > > Thanks a lot.
> > >
> > > ===============Server side
> > coe===============================
> > > @POST
> > > @Path("/upload/book")
> > > public void postBook(MultipartBody body) {
> > >  try {
> > >  System.out.println("start post");
> > >  List<Attachment> attachments =
> > body.getAllAttachments();
> > >  DataHandler dataHandler =
> > attachments.get(0).getDataHandler();
> > >  InputStream inputStream =
> > dataHandler.getInputStream();
> > >  OutputStream outputStream = new
> > FileOutputStream(new
> > > File("/tmp/new.pdf"));
> > >  IOUtils.copy(inputStream, outputStream);
> > >  inputStream.close();
> > >  outputStream.close();
> > >  System.out.println("end post");
> > > } catch (Exception e) {
> > >  System.out.println("Exception");
> > > }
> > > }
> > >
> > > ====================My
> > Junit==========================
> > > public class UploadClassTest {
> > >  @Test
> > >  public void uploadClass() throws
> > ClientProtocolException, IOException {
> > >   HttpClient httpClient = new
> > DefaultHttpClient();
> > >   HttpPost httpPost = new HttpPost("
> > > http://localhost:8080/spring_cxf_rest/rest/upload/book");
> > >
> > >   FileBody fileBody = new FileBody(new
> > File("/tmp/Citi.pdf"));
> > >
> > >   MultipartEntity reqEntity = new
> > MultipartEntity();
> > >   reqEntity.addPart("file1",
> > fileBody);
> > >
> > >   httpPost.setEntity(reqEntity);
> > >
> > >   httpClient.execute(httpPost);
> > >  }
> > > }
> > >
> > >
> > >
> >
>
>
>

Re: some questions about cxf rest uploading file

Posted by acec acec <to...@yahoo.ca>.
Thanks.

1) If I use cxf WebClient, I can set contentId like the follwing:

attachmentList.add(new Attachment("pdf1", "application/pdf", new FileInputStream(uploadFile)));

If I use the the following form to upload the file, How can I contentId?
 
 <form method="post" action="/spring_cxf_rest/rest/upload/book" enctype="multipart/form-data">
  name: <input type="text" name="name"/><br/>
  file: <input type="file" name="file"/><br/>
  <input type="submit" value="Submit"/>
 </form>

2) According to cxf guide "When handling complex multipart/form-data submissions (such as those containing files) MultipartBody (and Attachment) need to be used directly."

When I handle the above form, I have to use MultipartBody, is there easy way to parse text input and file input from MultipartBody?

Regards.


--- On Thu, 2/3/11, Sergey Beryozkin <sb...@gmail.com> wrote:

> From: Sergey Beryozkin <sb...@gmail.com>
> Subject: Re: some questions about cxf rest uploading file
> To: users@cxf.apache.org
> Received: Thursday, February 3, 2011, 9:54 AM
> Hi
> 
> On Thu, Feb 3, 2011 at 2:29 PM, acec acec <to...@yahoo.ca>
> wrote:
> 
> > Hi, all
> > I am using the following code to upload a file. It
> works fine.
> >
> > But I have several questions:
> > 1) If I change body.getAllAttachments() ==>
> body.getAttachment(contentId),
> > What does mean "contentId"? In my junit code, How can
> I set that contentId?
> >
> > Content-Id the id of the individual multi-part; sure,
> if you know the
> contentId then you can use
> 
> body.getAttachment(contentId)
> 
> 
> > 2)Can I get original file name on server side? I
> tried
> > dataHandler.getName(), but it return null.
> >
> >
> If it's a multipart/form-data then you can get a
> ContentDisposition header
> from the Attachment and get the name; otherwise you can
> just introduce a
> custom header and use it during the creation of the
> individual part and then
> retrieve it from Attachment.
> 
> 
> > 3)In my junit code, when I add Part using
> (reqEntity.addPart("file1",
> > fileBody)), how can I retrieve the name "file1" from
> my server side?
> >
> > You're using the the Apache Http Client, so I'm not
> sure what exactly it
> produces. If it's a multipart/form-data request then on the
> cxf side do
> attachment.getContentDisposition() and get the file name
> 
> 
> > 4)I never use MTOM, when I am using the following code
> to upload one PDF
> > file, does is use base64?
> >
> >
> Not sure what Apache HttpClient does there
> 
> Cheers, Sergey
> 
> 
> > Thanks a lot.
> >
> > ===============Server side
> coe===============================
> > @POST
> > @Path("/upload/book")
> > public void postBook(MultipartBody body) {
> >  try {
> >  System.out.println("start post");
> >  List<Attachment> attachments =
> body.getAllAttachments();
> >  DataHandler dataHandler =
> attachments.get(0).getDataHandler();
> >  InputStream inputStream =
> dataHandler.getInputStream();
> >  OutputStream outputStream = new
> FileOutputStream(new
> > File("/tmp/new.pdf"));
> >  IOUtils.copy(inputStream, outputStream);
> >  inputStream.close();
> >  outputStream.close();
> >  System.out.println("end post");
> > } catch (Exception e) {
> >  System.out.println("Exception");
> > }
> > }
> >
> > ====================My
> Junit==========================
> > public class UploadClassTest {
> >  @Test
> >  public void uploadClass() throws
> ClientProtocolException, IOException {
> >   HttpClient httpClient = new
> DefaultHttpClient();
> >   HttpPost httpPost = new HttpPost("
> > http://localhost:8080/spring_cxf_rest/rest/upload/book");
> >
> >   FileBody fileBody = new FileBody(new
> File("/tmp/Citi.pdf"));
> >
> >   MultipartEntity reqEntity = new
> MultipartEntity();
> >   reqEntity.addPart("file1",
> fileBody);
> >
> >   httpPost.setEntity(reqEntity);
> >
> >   httpClient.execute(httpPost);
> >  }
> > }
> >
> >
> >
> 



Re: some questions about cxf rest uploading file

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi

On Thu, Feb 3, 2011 at 2:29 PM, acec acec <to...@yahoo.ca> wrote:

> Hi, all
> I am using the following code to upload a file. It works fine.
>
> But I have several questions:
> 1) If I change body.getAllAttachments() ==> body.getAttachment(contentId),
> What does mean "contentId"? In my junit code, How can I set that contentId?
>
> Content-Id the id of the individual multi-part; sure, if you know the
contentId then you can use

body.getAttachment(contentId)


> 2)Can I get original file name on server side? I tried
> dataHandler.getName(), but it return null.
>
>
If it's a multipart/form-data then you can get a ContentDisposition header
from the Attachment and get the name; otherwise you can just introduce a
custom header and use it during the creation of the individual part and then
retrieve it from Attachment.


> 3)In my junit code, when I add Part using (reqEntity.addPart("file1",
> fileBody)), how can I retrieve the name "file1" from my server side?
>
> You're using the the Apache Http Client, so I'm not sure what exactly it
produces. If it's a multipart/form-data request then on the cxf side do
attachment.getContentDisposition() and get the file name


> 4)I never use MTOM, when I am using the following code to upload one PDF
> file, does is use base64?
>
>
Not sure what Apache HttpClient does there

Cheers, Sergey


> Thanks a lot.
>
> ===============Server side coe===============================
> @POST
> @Path("/upload/book")
> public void postBook(MultipartBody body) {
>  try {
>  System.out.println("start post");
>  List<Attachment> attachments = body.getAllAttachments();
>  DataHandler dataHandler = attachments.get(0).getDataHandler();
>  InputStream inputStream = dataHandler.getInputStream();
>  OutputStream outputStream = new FileOutputStream(new
> File("/tmp/new.pdf"));
>  IOUtils.copy(inputStream, outputStream);
>  inputStream.close();
>  outputStream.close();
>  System.out.println("end post");
> } catch (Exception e) {
>  System.out.println("Exception");
> }
> }
>
> ====================My Junit==========================
> public class UploadClassTest {
>  @Test
>  public void uploadClass() throws ClientProtocolException, IOException {
>   HttpClient httpClient = new DefaultHttpClient();
>   HttpPost httpPost = new HttpPost("
> http://localhost:8080/spring_cxf_rest/rest/upload/book");
>
>   FileBody fileBody = new FileBody(new File("/tmp/Citi.pdf"));
>
>   MultipartEntity reqEntity = new MultipartEntity();
>   reqEntity.addPart("file1", fileBody);
>
>   httpPost.setEntity(reqEntity);
>
>   httpClient.execute(httpPost);
>  }
> }
>
>
>