[英]J2EE Jersey File Upload - input is always null
我嘗試創建一個上傳文件的靜態服務。 我遵循以下步驟:
http://examples.javacodegeeks.com/enterprise-java/rest/jersey/jersey-file-upload-example/
http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/
但是,當我上傳文件(例如,.pdf)時,輸入FormDataMultiPart始終為NULL,我不明白為什么。 我使用的庫是“ jersey-multipart”和“ jersey-core”。 我的代碼:
周到的服務:
@Path("/reservation")
public class ReservationWs {
/** The Constant log. */
private static final Logger LOGGER = LoggerFactory.getLogger(ReservationWs.class.getName());
private static final String SERVER_UPLOAD_LOCATION_FOLDER = "C://opt/share/reservation/";
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail) {
String uploadedFileLocation = SERVER_UPLOAD_LOCATION_FOLDER
+ fileDetail.getFileName();
// save it
saveFile(uploadedInputStream, uploadedFileLocation);
String output = "File uploaded to : " + uploadedFileLocation;
return Response.status(200).entity(output).build();
}
@POST
@Path("/upload2")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile2(FormDataMultiPart form) {
FormDataBodyPart filePart = form.getField("file");
ContentDisposition headerOfFilePart = filePart.getContentDisposition();
InputStream fileInputStream = filePart.getValueAs(InputStream.class);
String filePath = SERVER_UPLOAD_LOCATION_FOLDER + headerOfFilePart.getFileName();
// save the file to the server
saveFile(fileInputStream, filePath);
String output = "File saved to server location using FormDataMultiPart : " + filePath;
System.out.println(output);
return Response.status(200).entity(output).build();
}
}
我的客戶:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Form Page</title>
</head>
<body>
<h1>Upload a File</h1>
<form action="reservation/upload" method="post" enctype="multipart/form-data">
<p>
Select a file : <input type="file" name="file" size="55" />
</p>
<input type="submit" value="Upload It" />
</form>
</body>
</html>
當我嘗試調用“上傳”時,輸入為null,並且錯誤日志如下:
嚴重:El Servlet.service()para servlet [rest_1288520529]上下文[/檢查]異常[錯誤處理Web服務請求] com.checking.reservation.ws.ReservationWs引起了java.lang.NullPointerException異常。 .uploadFile(ReservationWs.java:74)位於sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)位於sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)位於sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl。 ),位於org.apache.cxf.service的org.apache.openejb.server.cxf.rs.PojoInvoker.performInvocation(PojoInvoker.java:43)的java.lang.reflect.Method.invoke(Method.java:497)處。 org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.invoke(JAXRSInvoker.java:89)上的invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)在org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:165)在org.apache.cxf.interceptor.ServiceInvoker的org.apache.openejb.server.cxf.rs.AutoJAXRSInvoker.invoke(AutoJAXRSInvoker.java:68) 在org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:93)處的Interceptor $ 1.run(ServiceInvokerInterceptor.java:57)在org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)在org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:240)在org.apache.openejb.server.cxf。 org.apache.openejb.server.rest.RsServlet.service(RsServlet.java:53)處的rs.CxfRsHttpListener.onMessage(CxfRsHttpListener.java:187)在javax.servlet.http.HttpServlet.service(HttpServlet.java:727)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)在org.apache.tomcat.websocket.server.WsFilter .doFilter(WsFilter.java:52)位於org.apache.catalina.core.ApplicationFilterChain.internalDoFi org.apache.catalina.core上的lter(ApplicationFilterChain.java:241)在net.bull.javamelody上的net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:198)上的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)處的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)處的.MonitoringFilter.doFilter(MonitoringFilter.java:176) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)上的org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)在org.apache.tomee.catalina.OpenEJBValve.invoke(位於org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)的OpenEJBValve.java:44)位於org.apache.catalina的org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) org.apache.catalina.val上的.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)處的ves.AccessLogValve.invoke(AccessLogValve.java:950)在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)在org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:611)在org.apache.tomcat.util.net.JIoEndpoint org處的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)處的$ SocketProcessor.run(JIoEndpoint.java:316)在org處的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)在java.lang.Thread.run(Thread.java:745)
當我嘗試調用“ upload2”時,輸入為空,並且錯誤記錄如下:
2015年9月11日上午9:12:21 org.apache.catalina.core.StandardWrapperValve調用GRAVE:El Servlet.service()para el Servlet [rest_348842263]上下文[/檢查]異常處理[錯誤處理Webservice請求]在com.checking.reservation.ws.ReservationWs.uploadFile2(ReservationWs.java:90)處在java.lang.NullPointerException處,在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)處在sun.reflect.NativeMethodAccessorImpl.invoke( org.apache.openejb.server.cxf.rs上的java.lang.reflect.Method.invoke(Method.java:497)上的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)上的NativeMethodAccessorImpl.java:62) org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)上的.PojoInvoker.performInvocation(PojoInvoker.java:43),位於org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:165)上的。 ),網址為org.apache.openejb.server.cxf.rs.AutoJAXRSInvoker的org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:89)。 在org.org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:93)處org.apache.cxf.interceptor.ServiceInvokerInterceptor $ 1.run(ServiceInvokerInterceptor.java:57)處調用(AutoJAXRSInvoker.java:68)。 org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)上的apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)at org.apache.cxf.transport.http.AbstractHTTPDestination.in org.apache.openejb.server.cxf.rs.CxfRsHttpListener.onMessage(CxfRsHttpListener.java:187)處的AbstractHTTPDestination.java:240)(org.apache.openejb.server.rest.RsServlet.service(RsServlet.java:53)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain)處org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)處javax.servlet.http.HttpServlet.service(HttpServlet.java:727) .java:208),位於org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFi org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)的net.bull.javamelody的lter.java:52) .org的net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:176)的org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)的.MonitoringFilter.doFilter(MonitoringFilter.java:198)。 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.org上的apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)處的org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)處的org.apache.catalina.core org.apache.catalina.valves上的.StandardHostValve.invoke(StandardHostValve.java:171)。 org.org.apache.catalina.valves.AccessLogValve.invoke(ErrorLogValve.java:950)上org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)上的ErrorReportValve.invoke(ErrorReportValve.java:103) org.apache.coyote.http11.abache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol)的.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)在org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:316)處的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)處的.java:611)。 org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)處的並發ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)在java.lang.Thread.run(Thread.java: 745)
任何想法?
我現在發現一個不好的解決方案。
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@FormDataParam("file") InputStream file, @FormDataParam("file") FormDataContentDisposition fileDetail, @QueryParam("fileName") String fileName){
...
...
String uploadedFileLocation = SERVER_UPLOAD_LOCATION_FOLDER+ fileName;//fileDetail.getFileName();
// save it
saveFile(file, uploadedFileLocation);
...
//Logic of the service.
...
//Delete file from local.
}
private void saveFile(InputStream uploadedInputStream, String serverLocation) throws IOException {
OutputStream outpuStream=null;
try {
outpuStream = new FileOutputStream(new File(serverLocation));
int read = 0;
byte[] bytes = new byte[1024];
outpuStream = new FileOutputStream(new File(serverLocation));
while ((read = uploadedInputStream.read(bytes)) != -1) {
outpuStream.write(bytes, 0, read);
}
outpuStream.flush();
outpuStream.close();
} catch( IOException e){
LOGGER.debug("[UploadWs - saveFile] - error: "+e);
} finally{
if(outpuStream!=null){
outpuStream.close();
}
}
}
“ fileDetail”始終為null,我不知道為什么(如果有人知道解決方案,請說出來),因此我添加了客戶端發送給我的參數“ fileName”(文件名)。 我建立位置,將文件保存在本地,執行服務邏輯(在我的情況下,我發送包含此文件的電子郵件),然后從本地刪除文件。
這不是一個好的解決方案,因為我添加了一個unnecesarry參數,並將文件保存在本地。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.