Java J2EE Jersey文件上载-输入始终为空

Java J2EE Jersey文件上载-输入始终为空,java,jakarta-ee,upload,jersey,multipart,Java,Jakarta Ee,Upload,Jersey,Multipart,我尝试创建一个可以上传文件的restful服务。我遵循以下步骤: 但是,当我上传一个文件(例如.pdf)时,输入FormDataMultiPart总是空的,我不明白为什么。我使用libs jersey多部分和jersey核心。我的代码: Restful服务: @Path("/reservation") public class ReservationWs { /** The Constant log. */ private static final L

我尝试创建一个可以上传文件的restful服务。我遵循以下步骤:

但是,当我上传一个文件(例如.pdf)时,输入FormDataMultiPart总是空的,我不明白为什么。我使用libs jersey多部分和jersey核心。我的代码:

Restful服务:

 @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>
当我尝试调用upload时,输入为null,错误日志为:

GRAVE:El Servlet.service para El Servlet[rest_1288520529]en El contexto con ruta[/checking]lanzóla execpción[错误处理] Web服务请求]con causa raíz java.lang.NullPointerException位于 com.checking.reservation.ws.ReservationWs.uploadFileReservationWs.java:74 在sun.reflect.NativeMethodAccessorImpl.invoke0Native方法在 sun.reflect.NativeMethodAccessorImpl.invokeNativeMethodAccessorImpl.java:62 在 sun.reflect.DelegatingMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43 java:497 at org.apache.openejb.server.cxf.rs.PojoInvoker.performinHolidatePojoinvoker.java:43 在 org.apache.cxf.service.invoker.AbstractInvoker.invokeAbstractInvoker.java:96 位于org.apache.cxf.jaxrs.JAXRSInvoker.invokeJAXRSInvoker.java:165 位于org.apache.cxf.jaxrs.JAXRSInvoker.invokeJAXRSInvoker.java:89 at org.apache.openejb.server.cxf.rs.AutoJAXRSInvoker.invokeAutoJAXRSInvoker.java:68 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.runServiceInvokerInterceptor.java:57 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessageServiceInvokerInterceptor.java:93 在 org.apache.cxf.phase.PhaseInterceptorChain.doInterceptPhaseInterceptorChain.java:263 在 org.apache.cxf.transport.ChainInitiationObserver.onMessageChainInitiationObserver.java:121 在 org.apache.cxf.transport.http.AbstractHTTPDestination.invokeAbstractHTTPDestination.java:240 在 org.apache.openejb.server.cxf.rs.cxfrshtplistener.onmessagecxfrshtplistener.java:187 在 org.apache.openejb.server.rest.RsServlet.serviceRsServlet.java:53 在javax.servlet.http.HttpServlet.serviceHttpServlet.java:727 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicationFilterChain.java:303 在 org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilterChain.java:208 在 org.apache.tomcat.websocket.server.WsFilter.doFilterWsFilter.java:52 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicationFilterChain.java:241 在 org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilterChain.java:208 在 net.bull.javamelody.MonitoringFilter.doFilterMonitoringFilter.java:198 在 net.bull.javamelody.MonitoringFilter.doFilterMonitoringFilter.java:176 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicationFilterChain.java:241 在 org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilterChain.java:208 在 org.apache.catalina.core.StandardWrapperValve.invokeStandardWrapperValve.java:220 在 org.apache.catalina.core.StandardContextValve.invokeStandardContextValve.java:122 在 org.apache.tomee.catalina.OpenEJBValve.invokePenejbvalve.java:44 在 org.apache.catalina.authenticator.AuthenticatorBase.invokeAuthenticatorBase.java:501 在 org.apache.catalina.core.StandardHostValve.invokeStandardHostValve.java:171 在 org.apache.catalina.valves.ErrorReportValve.invokeErrorReportValve.java:103 在 org.apache.catalina.valves.AccessLogValve.invokeAccessLogValve.java:950 在 org.apache.catalina.core.StandardEngineValve.invokeStandardenginievalve.java:116 在 org.apache.catalina.connector.CoyoteAdapter.serviceCoyoteAdapter.java:408 在 org.apache.coyote.http11.AbstractHttp11Processor.processAbstractHttp11Processor.java:1070 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.processAbstractProtocol.java:611 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.runJIoEndpoint.java:316 在 java.util.concurrent.ThreadPoolExecutor.runWorkerThreadPoolExecutor.java:1142 在 java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:617 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.runTaskThread.java:61 java:745

当我尝试调用upload2时,输入为null,错误日志为:

2015年9月11日上午9:12:21 org.apache.catalina.core.StandardWrapperValve 调用GRAVE:El Servlet.service para El Servlet[rest_348842263]en el contexto con ruta[/checking]lanzóla execpción[错误处理] Web服务请求]con causa raíz java.lang.NullPointerException位于 com.checking.reservation.ws.ReservationWs.uploadFile2ReservationWs.java:90 在sun.reflect.NativeMethodAccessorImpl.invoke0Native方法在 sun.reflect.NativeMethodAccessorImpl.invokeNativeMethodAccessorImpl.java:62 在 太阳资源 flect.DelegatingMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43 java:497 at org.apache.openejb.server.cxf.rs.PojoInvoker.performinHolidatePojoinvoker.java:43 在 org.apache.cxf.service.invoker.AbstractInvoker.invokeAbstractInvoker.java:96 位于org.apache.cxf.jaxrs.JAXRSInvoker.invokeJAXRSInvoker.java:165 位于org.apache.cxf.jaxrs.JAXRSInvoker.invokeJAXRSInvoker.java:89 at org.apache.openejb.server.cxf.rs.AutoJAXRSInvoker.invokeAutoJAXRSInvoker.java:68 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.runServiceInvokerInterceptor.java:57 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessageServiceInvokerInterceptor.java:93 在 org.apache.cxf.phase.PhaseInterceptorChain.doInterceptPhaseInterceptorChain.java:263 在 org.apache.cxf.transport.ChainInitiationObserver.onMessageChainInitiationObserver.java:121 在 org.apache.cxf.transport.http.AbstractHTTPDestination.invokeAbstractHTTPDestination.java:240 在 org.apache.openejb.server.cxf.rs.cxfrshtplistener.onmessagecxfrshtplistener.java:187 在 org.apache.openejb.server.rest.RsServlet.serviceRsServlet.java:53 在javax.servlet.http.HttpServlet.serviceHttpServlet.java:727 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicationFilterChain.java:303 在 org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilterChain.java:208 在 org.apache.tomcat.websocket.server.WsFilter.doFilterWsFilter.java:52 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicationFilterChain.java:241 在 org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilterChain.java:208 在 net.bull.javamelody.MonitoringFilter.doFilterMonitoringFilter.java:198 在 net.bull.javamelody.MonitoringFilter.doFilterMonitoringFilter.java:176 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilterApplicationFilterChain.java:241 在 org.apache.catalina.core.ApplicationFilterChain.doFilterApplicationFilterChain.java:208 在 org.apache.catalina.core.StandardWrapperValve.invokeStandardWrapperValve.java:220 在 org.apache.catalina.core.StandardContextValve.invokeStandardContextValve.java:122 在 org.apache.tomee.catalina.OpenEJBValve.invokePenejbvalve.java:44 在 org.apache.catalina.authenticator.AuthenticatorBase.invokeAuthenticatorBase.java:501 在 org.apache.catalina.core.StandardHostValve.invokeStandardHostValve.java:171 在 org.apache.catalina.valves.ErrorReportValve.invokeErrorReportValve.java:103 在 org.apache.catalina.valves.AccessLogValve.invokeAccessLogValve.java:950 在 org.apache.catalina.core.StandardEngineValve.invokeStandardenginievalve.java:116 在 org.apache.catalina.connector.CoyoteAdapter.serviceCoyoteAdapter.java:408 在 org.apache.coyote.http11.AbstractHttp11Processor.processAbstractHttp11Processor.java:1070 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.processAbstractProtocol.java:611 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.runJIoEndpoint.java:316 在 java.util.concurrent.ThreadPoolExecutor.runWorkerThreadPoolExecutor.java:1142 在 java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:617 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.runTaskThread.java:61 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总是空的,我不知道为什么如果有人知道这个解决方案,就说出来,这样我就添加了客户端发送给我的文件的参数fileName。我建立位置,我在本地保存文件,在我的案例中执行服务的逻辑,我发送一封包含该文件的电子邮件,然后从本地删除该文件

这不是一个好的解决方案,因为我添加了一个不必要的参数,并将文件保存在本地