File upload Jersey ApacheConnector多部分文件上载-未找到多部分边界

File upload Jersey ApacheConnector多部分文件上载-未找到多部分边界,file-upload,httpclient,boundary,jersey-client,File Upload,Httpclient,Boundary,Jersey Client,我希望有人能帮忙 我已经为我的SpringWebMVC应用程序编写了一个客户端,我使用的是jersey和ApacheConnector。我需要保留jsessionid,不知道如何使用jersey的HttpUrlConnector实现这一点。我还应该提到,在我需要跟踪会话之前,文件上传服务与jersey的HttpUrlConnector一起工作 我知道SpringWebMVC文件上传服务可以工作,因为我的web前端可以上传文件。为了完整起见,它看起来是这样的 @ResponseBody priva

我希望有人能帮忙

我已经为我的SpringWebMVC应用程序编写了一个客户端,我使用的是jersey和ApacheConnector。我需要保留jsessionid,不知道如何使用jersey的HttpUrlConnector实现这一点。我还应该提到,在我需要跟踪会话之前,文件上传服务与jersey的HttpUrlConnector一起工作

我知道SpringWebMVC文件上传服务可以工作,因为我的web前端可以上传文件。为了完整起见,它看起来是这样的

@ResponseBody
private Image onSubmit(@ModelAttribute("uploadedFile") ImageUpload imageUpload) {   
        service.create(imageUpload);
        return new Image();
}
客户端初始化代码如下所示:

clientConfig = new ClientConfig();
connector = new ApacheConnector(clientConfig);
clientConfig.connector(connector);
client = ClientBuilder.newBuilder().withConfig(clientConfig)
                .register(MultiPartFeature.class)
                .register(JacksonJsonProvider.class).build();
target = client.target(url);
File file = new File(fileName);
FormDataMultiPart formDataMultiPart = new FormDataMultiPart();
FormDataBodyPart bodyPart = new FormDataBodyPart("file", file,
                MediaType.APPLICATION_OCTET_STREAM_TYPE);
formDataMultiPart.bodyPart(bodyPart);
response = target
                .path(path)
                .request()
                .post(Entity.entity(formDataMultiPart,
                        formDataMultiPart.getMediaType()), Response.class);
我已经注册了MultiPartFeature和JacksonJsonProvider,因为我想使用jackson2.x

上载文件的客户端代码如下所示:

clientConfig = new ClientConfig();
connector = new ApacheConnector(clientConfig);
clientConfig.connector(connector);
client = ClientBuilder.newBuilder().withConfig(clientConfig)
                .register(MultiPartFeature.class)
                .register(JacksonJsonProvider.class).build();
target = client.target(url);
File file = new File(fileName);
FormDataMultiPart formDataMultiPart = new FormDataMultiPart();
FormDataBodyPart bodyPart = new FormDataBodyPart("file", file,
                MediaType.APPLICATION_OCTET_STREAM_TYPE);
formDataMultiPart.bodyPart(bodyPart);
response = target
                .path(path)
                .request()
                .post(Entity.entity(formDataMultiPart,
                        formDataMultiPart.getMediaType()), Response.class);
我还尝试了如下代码:

final FileDataBodyPart filePart = new FileDataBodyPart("file", new File(fileName));
         final MultiPart multipart = new FormDataMultiPart()
            .field("foo", "bar")
            .bodyPart(filePart);
response = target
                .path(path)
                .request()
                .post(Entity.entity(multipart,
                        multipart.getMediaType()), Response.class);
哪个更接近于文档

上传文件后,服务器会做出响应

org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:990)
at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:310)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:334)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)
at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156)
at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:139)
at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1047)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:892)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为找不到多部分边界
位于org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.(FileUploadBase.java:990)
位于org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:310)
位于org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:334)
位于org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)
位于org.springframework.web.multipart.commons.commonmultipartresolver.parseRequest(commonmultipartresolver.java:156)
位于org.springframework.web.multipart.commons.commonmultipartresolver.resolveMultipart(commonmultipartresolver.java:139)
位于org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1047)
位于org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:892)
位于org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
位于org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
这似乎是一个相当常见的问题,我假设这意味着我没有边界集,所以我在客户端启用了调试

DEBUG: org.apache.http.headers - >> POST /api/content/image/upload HTTP/1.1
DEBUG: org.apache.http.headers - >> Content-Type: multipart/form-data
DEBUG: org.apache.http.headers - >> User-Agent: Jersey/2.3.1 (Apache HttpClient 4.3)
DEBUG: org.apache.http.headers - >> Transfer-Encoding: chunked
DEBUG: org.apache.http.headers - >> Host: localhost:8010
DEBUG: org.apache.http.headers - >> Connection: Keep-Alive
DEBUG: org.apache.http.headers - >> Cookie: JSESSIONID=2xl9hgb4zq031jpbrn07ylp10
DEBUG: org.apache.http.headers - >> Cookie2: $Version=1
DEBUG: org.apache.http.wire -  >> "7d[\r][\n]"
DEBUG: org.apache.http.wire -  >> "--Boundary_1_674530318_1380707961372[\r][\n]"
DEBUG: org.apache.http.wire -  >> "Content-Type: application/octet-stream[\r][\n]"
DEBUG: org.apache.http.wire -  >> "Content-Disposition: form-data; name="file"[\r][\n]"
DEBUG: org.apache.http.wire -  >> "[\r][\n]"
DEBUG: org.apache.http.wire -  >> "[\r][\n]"
DEBUG: org.apache.http.wire -  >> "1061[\r][\n]"
DEBUG: org.apache.http.wire -  >> "[0x89]PNG[\r][\n]"
DEBUG: org.apache.http.wire -  >> "[0x1a][\n]"
DEBUG: org.apache.http.wire -  >> "[0x0][0x0][0x0][\r]IHDR[0x0]  -!!!! SNIP you don't want to see this !!!!
DEBUG: org.apache.http.wire -  >> "[\r][\n]"
DEBUG: org.apache.http.wire -  >> "2a[\r][\n]"
DEBUG: org.apache.http.wire -  >> "[\r][\n]"
DEBUG: org.apache.http.wire -  >> "--Boundary_1_674530318_1380707961372--[\r][\n]"
DEBUG: org.apache.http.wire -  >> "[\r][\n]"
DEBUG: org.apache.http.wire -  >> "0[\r][\n]"
DEBUG: org.apache.http.wire -  >> "[\r][\n]"
DEBUG: org.apache.http.wire -  << "HTTP/1.1 500 Server Error[\r][\n]"
DEBUG: org.apache.http.wire -  << "Content-Type: text/html; charset=ISO-8859-1[\r][\n]"
DEBUG: org.apache.http.wire -  << "Cache-Control: must-revalidate,no-cache,no-store[\r][\n]"
DEBUG: org.apache.http.wire -  << "Content-Length: 13979[\r][\n]"
DEBUG: org.apache.http.wire -  << "Server: Jetty(9.0.5.v20130815)[\r][\n]"
DEBUG: org.apache.http.wire -  << "[\r][\n]"
DEBUG: org.apache.http.impl.conn.DefaultClientConnection - Receiving response: HTTP/1.1 500 Server Error
DEBUG: org.apache.http.headers - << HTTP/1.1 500 Server Error
DEBUG: org.apache.http.headers - << Content-Type: text/html; charset=ISO-8859-1
DEBUG: org.apache.http.headers - << Cache-Control: must-revalidate,no-cache,no-store
DEBUG: org.apache.http.headers - << Content-Length: 13979
DEBUG: org.apache.http.headers - << Server: Jetty(9.0.5.v20130815)
DEBUG: org.apache.http.impl.client.DefaultHttpClient - Connection can be kept alive indefinitely
DEBUG: ws.webraw.jsonrest.JsonRestClient - reponse code : 500
DEBUG:org.apache.http.headers->>POST/api/content/image/upload http/1.1
调试:org.apache.http.headers->>内容类型:多部分/表单数据
调试:org.apache.http.headers->>用户代理:Jersey/2.3.1(apache HttpClient 4.3)
调试:org.apache.http.headers->>传输编码:分块
调试:org.apache.http.headers->Host:localhost:8010
调试:org.apache.http.headers->>连接:保持活动状态
调试:org.apache.http.headers->Cookie:JSESSIONID=2xl9hgb4zq031jpbrn07ylp10
调试:org.apache.http.headers->Cookie2:$Version=1
调试:org.apache.http.wire->“7d[\r][\n]”
调试:org.apache.http.wire->“--Boundary\u 1\u 674530318\u 1380707961372[\r][\n]”
调试:org.apache.http.wire->“内容类型:应用程序/八位字节流[\r][\n]”
调试:org.apache.http.wire->“内容处置:表单数据;name=“文件”[\r][\n]”
调试:org.apache.http.wire->“[\r][\n]”
调试:org.apache.http.wire->“[\r][\n]”
调试:org.apache.http.wire->“1061[\r][\n]”
调试:org.apache.http.wire->“[0x89]PNG[\r][\n]”
调试:org.apache.http.wire->“[0x1a][\n]”
调试:org.apache.http.wire->“[0x0][0x0][0x0][\r]IHDR[0x0]-!!剪断您不想看到的内容!!!!
调试:org.apache.http.wire->“[\r][\n]”
调试:org.apache.http.wire->“2a[\r][\n]”
调试:org.apache.http.wire->“[\r][\n]”
调试:org.apache.http.wire->“--Boundary\u 1\u 674530318\u 1380707961372--[\r][\n]”
调试:org.apache.http.wire->“[\r][\n]”
调试:org.apache.http.wire->“0[\r][\n]”
调试:org.apache.http.wire->“[\r][\n]”

DEBUG:org.apache.http.wire-这是所有Jersey连接器实现中的一个已知问题;相关的错误是。正在中跟踪修复此问题的重构


当前推荐的解决方法是简单地使用
ClientBuilder
的默认实现,它使用
java.net.HttpUrlConnection
,并正确地将所需的
boundary
值添加到
内容类型
标题。

尝试通过调用来更改
post
调用的第二个参数e> MultiPartMediaTypes.createFormData()
。这将创建一个新的带有配置边界的
MediaType
实例,该实例将由MultiPart编写器拾取

target
    .path(path)
    .request()
    .post(Entity.entity(multipart,
                    MultiPartMediaTypes.createFormData()), Response.class);