Hi Sergey,
No, I am not using struts.
I made a simpler standalone example.
//------------------------------------------------------------------------------------------------
package tests.cxf.multi;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.apache.log4j.Logger;
@Path("/tests/cxf/books")
public class MultipartBooks {
private static Logger log = Logger.getLogger(MultipartBooks.class);
public MultipartBooks() {}
@POST
@Path("jsonform")
@Consumes("multipart/form-data")
public void addBookJsonFromForm(Book b1) {
log.debug("MULTIPARTBOOKS: addBookJsonFromForm, Book:" +
b1.getName() + ", id:" + b1.getId());
}
@POST
@Path("filesform")
@Consumes("multipart/form-data")
public void addBookFilesForm(
@Multipart("owner") String name,
@Multipart("files") List<Book> books) {
log.debug("MULTIPARTBOOKS: addBookFilesForm, owner name:" + name +
", count:" + books.size());
for (Book book : books) {
log.debug(" Book " + book.getName());
}
}
}
//---------------------------------------------------------------------------------------
I am using firefox REST Client to send the request.
The saved request with NO content-id:
{"requestUrl":"http://<IP
ADDRESS>:8080/multi-1.0-SNAPSHOT/services/tests/cxf/books/filesform","requestMethod":"POST","requestBody":"--bqJky99mlBWa-ZuqjC53mG6EzbmlxB\u000aContent-Disposition:
form-data; name=\"owner\"\u000aContent-Type:
text/plain\u000a\u000aLarry\u000a--bqJky99mlBWa-ZuqjC53mG6EzbmlxB\u000aContent-Disposition:
form-data; name=\"files\"\u000aContent-Type: multipart/mixed;
boundary=_Part_4_701508.1145579811786\u000a\u000a--_Part_4_701508.1145579811786\u000aContent-Disposition:
form-data; name=\"book1\"\u000aContent-Type: application/json;
charset=US-ASCII\u000aContent-Transfer-Encoding:
8bit\u000a\u000a{\"Book\":{\"name\":\"CXF in Action -
1\",\"id\":123}}\u000a--_Part_4_701508.1145579811786\u000aContent-Disposition:
form-data; name=\"book2\"\u000aContent-Type: application/json;
charset=US-ASCII\u000aContent-Transfer-Encoding:
8bit\u000a\u000a{\"Book\":{\"name\":\"CXF in Action -
2\",\"id\":124}}\u000a--_Part_4_701508.1145579811786--\u000a--bqJky99mlBWa-ZuqjC53mG6EzbmlxB--","headers":["Content-Type","multipart/form-data;
boundary=bqJky99mlBWa-ZuqjC53mG6EzbmlxB"]}
Resulting log:
Jul 21, 2011 12:31:07 PM org.apache.cxf.interceptor.AbstractLoggingInterceptor
log
INFO: Inbound Message
----------------------------
ID: 11
Address: http://<IP
ADDRESS>:8080/multi-1.0-SNAPSHOT/services/tests/cxf/books/filesform
Encoding: UTF-8
Http-Method: POST
Content-Type: multipart/form-data; charset=UTF-8;
boundary=bqJky99mlBWa-ZuqjC53mG6EzbmlxB
Headers:
{Accept=[audio/x-wav,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5],
accept-charset=[ISO-8859-1,utf-8;q=0.7,*;q=0.7], accept-encoding=[gzip,
deflate], cache-control=[no-cache], connection=[keep-alive],
Content-Length=[735], content-type=[multipart/form-data; charset=UTF-8;
boundary=bqJky99mlBWa-ZuqjC53mG6EzbmlxB],
cookie=[JSESSIONID=58E6D8C6B7C8CC2812E3F19CE3CEE892], host=[<IP ADDRESS>:8080],
pragma=[no-cache], user-agent=[Mozilla/5.0 (Windows NT 5.1; rv:5.0.1)
Gecko/20100101 Firefox/5.0.1]}
Payload: --bqJky99mlBWa-ZuqjC53mG6EzbmlxB
Content-Disposition: form-data; name="owner"
Content-Type: text/plain
Larry
--bqJky99mlBWa-ZuqjC53mG6EzbmlxB
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=_Part_4_701508.1145579811786
--_Part_4_701508.1145579811786
Content-Disposition: form-data; name="book1"
Content-Type: application/json; charset=US-ASCII
Content-Transfer-Encoding: 8bit
{"Book":{"name":"CXF in Action - 1","id":123}}
--_Part_4_701508.1145579811786
Content-Disposition: form-data; name="book2"
Content-Type: application/json; charset=US-ASCII
Content-Transfer-Encoding: 8bit
{"Book":{"name":"CXF in Action - 2","id":124}}
--_Part_4_701508.1145579811786--
--bqJky99mlBWa-ZuqjC53mG6EzbmlxB--
--------------------------------------
Jul 21, 2011 12:31:07 PM org.apache.cxf.jaxrs.utils.multipart.AttachmentUtils
getMultipart
WARNING: No multipart with content id files found, request content type :
multipart/form-data;boundary=bqJky99mlBWa-ZuqjC53mG6EzbmlxB;charset=UTF-8
Jul 21, 2011 12:31:07 PM
org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
WARNING: WebApplicationException has been caught : no cause is available
Jul 21, 2011 12:31:07 PM org.apache.cxf.interceptor.AbstractLoggingInterceptor
log
INFO: Outbound Message
---------------------------
ID: 11
Response-Code: 404
Content-Type: text/xml
Headers: {Date=[Thu, 21 Jul 2011 16:31:07 GMT]}
The saved request with content-id:
{"requestUrl":"http:// <IP
ADDRESS>:8080/multi-1.0-SNAPSHOT/services/tests/cxf/books/filesform","requestMethod":"POST","requestBody":"--bqJky99mlBWa-ZuqjC53mG6EzbmlxB\u000aContent-Disposition:
form-data; name=\"owner\"\u000aContent-Type:
text/plain\u000a\u000aLarry\u000a--bqJky99mlBWa-ZuqjC53mG6EzbmlxB\u000aContent-Disposition:
form-data; name=\"files\"\u000aContent-Type: multipart/mixed;
boundary=_Part_4_701508.1145579811786\u000aContent-Id:
<files>\u000a\u000a--_Part_4_701508.1145579811786\u000aContent-Disposition:
form-data; name=\"book1\"\u000aContent-Type: application/json;
charset=US-ASCII\u000aContent-Transfer-Encoding:
8bit\u000a\u000a{\"Book\":{\"name\":\"CXF in Action -
1\",\"id\":123}}\u000a--_Part_4_701508.1145579811786\u000aContent-Disposition:
form-data; name=\"book2\"\u000aContent-Type: application/json;
charset=US-ASCII\u000aContent-Transfer-Encoding:
8bit\u000a\u000a{\"Book\":{\"name\":\"CXF in Action -
2\",\"id\":124}}\u000a--_Part_4_701508.1145579811786--\u000a--bqJky99mlBWa-ZuqjC53mG6EzbmlxB--","headers":["Content-Type","multipart/form-data;
boundary=bqJky99mlBWa-ZuqjC53mG6EzbmlxB"]}
Resulting log:
Jul 21, 2011 12:32:05 PM org.apache.cxf.interceptor.AbstractLoggingInterceptor
log
INFO: Inbound Message
----------------------------
ID: 12
Address: http:// <IP
ADDRESS>:8080/multi-1.0-SNAPSHOT/services/tests/cxf/books/filesform
Encoding: UTF-8
Http-Method: POST
Content-Type: multipart/form-data; charset=UTF-8;
boundary=bqJky99mlBWa-ZuqjC53mG6EzbmlxB
Headers:
{Accept=[audio/x-wav,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5],
accept-charset=[ISO-8859-1,utf-8;q=0.7,*;q=0.7], accept-encoding=[gzip,
deflate], cache-control=[no-cache], connection=[keep-alive],
Content-Length=[755], content-type=[multipart/form-data; charset=UTF-8;
boundary=bqJky99mlBWa-ZuqjC53mG6EzbmlxB],
cookie=[JSESSIONID=58E6D8C6B7C8CC2812E3F19CE3CEE892], host=[<IP ADDRESS>:8080],
pragma=[no-cache], user-agent=[Mozilla/5.0 (Windows NT 5.1; rv:5.0.1)
Gecko/20100101 Firefox/5.0.1]}
Payload: --bqJky99mlBWa-ZuqjC53mG6EzbmlxB
Content-Disposition: form-data; name="owner"
Content-Type: text/plain
Larry
--bqJky99mlBWa-ZuqjC53mG6EzbmlxB
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=_Part_4_701508.1145579811786
Content-Id: <files>
--_Part_4_701508.1145579811786
Content-Disposition: form-data; name="book1"
Content-Type: application/json; charset=US-ASCII
Content-Transfer-Encoding: 8bit
{"Book":{"name":"CXF in Action - 1","id":123}}
--_Part_4_701508.1145579811786
Content-Disposition: form-data; name="book2"
Content-Type: application/json; charset=US-ASCII
Content-Transfer-Encoding: 8bit
{"Book":{"name":"CXF in Action - 2","id":124}}
--_Part_4_701508.1145579811786--
--bqJky99mlBWa-ZuqjC53mG6EzbmlxB--
--------------------------------------
DEBUG MultipartBooks [31] - MULTIPARTBOOKS: addBookFilesForm,
owner name:Larry
, count:2
DEBUG MultipartBooks [33] - Book CXF in Action - 1
DEBUG MultipartBooks [33] - Book CXF in Action - 2
Jul 21, 2011 12:32:05 PM org.apache.cxf.interceptor.AbstractLoggingInterceptor
log
INFO: Outbound Message
---------------------------
ID: 12
Response-Code: 204
Content-Type: text/xml
Headers: {Date=[Thu, 21 Jul 2011 16:32:05 GMT]}
I am using tomcat 7.0.14, CXF 2.4.1, linux red hat Enterprise Server5.5.
If you like, I can send you a war file, or eclipse project. File sharing sites
are blocked from here or I would put it to dropbox or similar.
Thanks!
-- Dave Collard
-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]]
Sent: Wednesday, July 20, 2011 7:41 PM
To: [email protected]
Subject: Re: JAXRS Multipart Form-Data requiring Content-ID
Hi
On Wed, Jul 20, 2011 at 5:32 PM, Collard, David L (Dave)
<[email protected]> wrote:
> I am processing multipart form-data for file uploads using JAX-RS.
> Using Apache CXF 2.4.1
>
>
> The example addBookFilesForm shown here is not working as-is for me:
> http://cxf.apache.org/docs/jax-rs-multiparts.html#JAX-RSMultiparts-Uploadingfiles
>
> Has an example request here:
> http://svn.apache.org/repos/asf/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/attachmentFormJsonFiles
>
> The second part of the form data is a multipart/mixed list of books.
> The relevant snippet of the above request is:
>
>
> Cntent-Disposition: form-data; name="files"
>
> Content-Type: multipart/mixed; boundary=_Part_4_701508.1145579811786
>
> This fails for me with
>
> WARNING: No multipart with content id files found
>
> If I add
> Content-Id:<files>
>
> to the request, then it works fine.
>
> Should it not use the name if the Content-ID is not specified?
> Is there something I can do to not require this Content-Id and use the name?
> It is not
> in my interface spec so hope to avoid requiring it.
>
That is a bit strange given that I can see this test working for me,
here is the trace:
POST /bookstore/books/filesform HTTP/1.1
Content-Type: multipart/form-data; boundary=bqJky99mlBWa-ZuqjC53mG6EzbmlxB
User-Agent: Jakarta Commons-HttpClient/3.1
Host: localhost:8081
Content-Length: 759
--bqJky99mlBWa-ZuqjC53mG6EzbmlxB
Content-Disposition: form-data; name="owner"
Content-Type: text/plain
Larry
--bqJky99mlBWa-ZuqjC53mG6EzbmlxB
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=_Part_4_701508.1145579811786
--_Part_4_701508.1145579811786
Content-Disposition: form-data; name="book1"
Content-Type: application/json; charset=US-ASCII
Content-Transfer-Encoding: 8bit
{"Book":{"name":"CXF in Action - 1","id":123}}
--_Part_4_701508.1145579811786
Content-Disposition: form-data; name="book2"
Content-Type: application/json; charset=US-ASCII
Content-Transfer-Encoding: 8bit
{"Book":{"name":"CXF in Action - 2","id":124}}
--_Part_4_701508.1145579811786--
--bqJky99mlBWa-ZuqjC53mG6EzbmlxB--
and the output is OK.
I also recall updating the code to check Content-Disposition if
Content-Id is missing.
Are you using Struts by any chance ? Here are some hints just in case:
http://cxf.apache.org/docs/jax-rs-multiparts.html#JAX-RSMultiparts-NoteaboutStruts
>
> On another note, there is an error in the addBookJaxbJsonForm example, the
> request has
>
> Content-ID: <jaxbPart>
>
> But the signature specifies "bookXML" not jaxbPart.
>
>
Fixed - should be propagated shortly
thanks, Sergey
>
> Thanks!
>
>
>
> -- DC
>
> [email protected]
>
>
>
>
--
Sergey Beryozkin
http://sberyozkin.blogspot.com
Talend - http://www.talend.com