2017-03-12 3 views
1

파일을받을 수있는 REST API (java)을 작성하려고합니다.Java에서 파일 보내기 REST 끝점

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(); 

그러나,이 설정으로, 내가 가없는가 칠 나는 다음과 같이 내 REST API를 본다 REST 엔드 포인트. 그리고 TomcatServer 로그는 말한다 :

[500] Exception occurred : argument type mismatch 

를 그런 다음, 다음과 같이 나는 REST API의 정의를 변경 시도 :

이 설정으로
public Response uploadFile(MultipartFormDataInput input) {} 

사실에 로그인 한 다음 오류가있는 REST API를 도달 할 수 있어요 나머지의 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) 

나는 웹에 다른 소스에서 다른 설정을 시도하고 여전히 제대로 설정할 수 없습니다 생각 했어요.

내 설정에서 누락 된 부분을 이해하는 데 도움이되고 어떻게 해결하여이 작업을 수행 할 수 있습니까?

고맙습니다.

답변

0

나는이 문제를 파악했다고 생각합니다. 내 REST-API 엔드 포인트는 실제로 JAX-RS가 아닌 MicroService입니다.

따라서 HTTP 요청의 비 정렬 화는 JAX-RS 기반 REST 끝점에서 발생하는 것과 동일하지 않습니다. 나는 마이크로 서비스를 작성하기 위해 msf4j 마이크로 서비스 프레임 워크를 사용했으며, 그들은 fileserver example에서 파일 업로드를 처리하는 방법을 설명했다.

직접 microservice 엔드 포인트를 호출 할 때 자신의 샘플에 대한 명령과 같이 내가 바이너리 스트림으로 파일을 보낼 수 있습니다

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

감사