REST端点以Java格式发送文件

REST端点以Java格式发送文件,java,rest,tomcat,file-upload,multipartform-data,Java,Rest,Tomcat,File Upload,Multipartform Data,我正在尝试编写一个RESTAPI(java)来接收文件。我的REST API如下所示: import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; @POST @Path("/upload") @Produces(MediaType.TEXT_PLAIN) @Consumes(MediaType.MULTIPART_FORM_DATA)

我正在尝试编写一个RESTAPI(java)来接收文件。我的REST API如下所示:

import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;

@POST
@Path("/upload")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@FormDataParam("file") InputStream uploadedInputStream,
                           @FormDataParam("file") FormDataContentDisposition fileDetail) {
    System.out.println("File Upload invoked");
    return Response.status(200).entity("File saved to " + UPLOAD_FOLDER).build();
}
HttpPost httppost = new HttpPost(URL);         
httppost.addHeader(HttpHeaders.CONTENT_TYPE,MediaType.MULTIPART_FORM_DATA);

MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

FileBody fileBody = new FileBody(file);
builder.addPart("file", fileBody);                        
builder.setContentType(ContentType.MULTIPART_FORM_DATA);

HttpEntity entity = builder.build();
httppost.setEntity(entity);
HttpResponse responseFromUpload = httpclient.execute(httppost);

int statusCode = responseFromUpload.getStatusLine().getStatusCode();
public Response uploadFile(MultipartFormDataInput input) {}
尝试将文件发送到此终结点的客户端如下所示:

import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;

@POST
@Path("/upload")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@FormDataParam("file") InputStream uploadedInputStream,
                           @FormDataParam("file") FormDataContentDisposition fileDetail) {
    System.out.println("File Upload invoked");
    return Response.status(200).entity("File saved to " + UPLOAD_FOLDER).build();
}
HttpPost httppost = new HttpPost(URL);         
httppost.addHeader(HttpHeaders.CONTENT_TYPE,MediaType.MULTIPART_FORM_DATA);

MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

FileBody fileBody = new FileBody(file);
builder.addPart("file", fileBody);                        
builder.setContentType(ContentType.MULTIPART_FORM_DATA);

HttpEntity entity = builder.build();
httppost.setEntity(entity);
HttpResponse responseFromUpload = httpclient.execute(httppost);

int statusCode = responseFromUpload.getStatusLine().getStatusCode();
public Response uploadFile(MultipartFormDataInput input) {}
但是,使用此设置,无法命中REST端点。TomcatServer日志显示:

[500] Exception occurred : argument type mismatch
然后,我尝试如下更改REST API定义:

import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;

@POST
@Path("/upload")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@FormDataParam("file") InputStream uploadedInputStream,
                           @FormDataParam("file") FormDataContentDisposition fileDetail) {
    System.out.println("File Upload invoked");
    return Response.status(200).entity("File saved to " + UPLOAD_FOLDER).build();
}
HttpPost httppost = new HttpPost(URL);         
httppost.addHeader(HttpHeaders.CONTENT_TYPE,MediaType.MULTIPART_FORM_DATA);

MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

FileBody fileBody = new FileBody(file);
builder.addPart("file", fileBody);                        
builder.setContentType(ContentType.MULTIPART_FORM_DATA);

HttpEntity entity = builder.build();
httppost.setEntity(entity);
HttpResponse responseFromUpload = httpclient.execute(httppost);

int statusCode = responseFromUpload.getStatusLine().getStatusCode();
public Response uploadFile(MultipartFormDataInput input) {}
通过此设置,我实际上能够访问REST API,并在REST API端记录以下错误:

java.lang.IllegalArgumentException: argument type mismatch

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.wso2.msf4j.internal.router.HttpMethodInfo.invoke(HttpMethodInfo.java:132)
at org.wso2.msf4j.internal.MSF4JMessageProcessor.dispatchMethod(MSF4JMessageProcessor.java:130)
at org.wso2.msf4j.internal.MSF4JMessageProcessor.receive(MSF4JMessageProcessor.java:72)
at org.wso2.carbon.transport.http.netty.listener.WorkerPoolDispatchingSourceHandler.lambda$publishToWorkerPool$12(WorkerPoolDispatchingSourceHandler.java:125)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
我在网上尝试了不同来源的不同设置,但仍然无法正确设置

我可以得到一些帮助来理解我的设置中缺失的部分,以及如何纠正它们以使其正常工作吗


谢谢

我想我已经解决了这个问题。我的REST-API端点实际上是一个微服务,而不是JAX-RS

因此,HTTP请求的解组与基于JAX-RS的REST端点的解组不同。我已经使用microservices框架编写了我的microservice,他们已经解释了如何在自己的应用程序中处理文件上传

直接调用microservice端点时,我可以将文件作为二进制流发送,如示例的cURL命令所示:

curl -v -X POST --data-binary @/testPng.png http://localhost:8080/filename.png

谢谢

我想我已经解决了这个问题。我的REST-API端点实际上是一个微服务,而不是JAX-RS

因此,HTTP请求的解组与基于JAX-RS的REST端点的解组不同。我已经使用microservices框架编写了我的microservice,他们已经解释了如何在自己的应用程序中处理文件上传

直接调用microservice端点时,我可以将文件作为二进制流发送,如示例的cURL命令所示:

curl -v -X POST --data-binary @/testPng.png http://localhost:8080/filename.png
谢谢