【问题标题】:J2EE Jersey File Upload - input is always nullJ2EE Jersey 文件上传 - 输入始终为空
【发布时间】:2015-12-07 16:19:53
【问题描述】:

我尝试创建一个上传文件的宁静服务。我按照以下步骤操作:

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>

当我尝试调用“上传”时,输入为空并且错误日志:

GRAVE: El Servlet.service() para el servlet [rest_1288520529] en el contexto con ruta [/checking] lanzó la excepción [错误处理 webservice request] con causa raíz java.lang.NullPointerException at com.checking.reservation.ws.ReservationWs.uploadFile(ReservationWs.java:74) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.openejb.server.cxf.rs.PojoInvoker.performInvocation(PojoInvoker.java:43) 在 org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) 在 org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:165) 在 org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:89) 在 org.apache.openejb.server.cxf.rs.AutoJAXRSInvoker.invoke(AutoJAXRSInvoker.java:68) 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57) 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:93) 在 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.rs.CxfRsHttpListener.onMessage(CxfRsHttpListener.java:187) 在 org.apache.openejb.server.rest.RsServlet.service(RsServlet.java:53) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:198) 在 net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:176) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 在 org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 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$SocketProcessor.run(JIoEndpoint.java:316) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.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] en el contexto con ruta [/checking] lanzó la excepción [错误处理 webservice request] con causa raíz java.lang.NullPointerException at com.checking.reservation.ws.ReservationWs.uploadFile2(ReservationWs.java:90) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.openejb.server.cxf.rs.PojoInvoker.performInvocation(PojoInvoker.java:43) 在 org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) 在 org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:165) 在 org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:89) 在 org.apache.openejb.server.cxf.rs.AutoJAXRSInvoker.invoke(AutoJAXRSInvoker.java:68) 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57) 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:93) 在 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.rs.CxfRsHttpListener.onMessage(CxfRsHttpListener.java:187) 在 org.apache.openejb.server.rest.RsServlet.service(RsServlet.java:53) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:198) 在 net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:176) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 在 org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 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$SocketProcessor.run(JIoEndpoint.java:316) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745)

有什么想法吗?

【问题讨论】:

    标签: java jakarta-ee upload jersey multipart


    【解决方案1】:

    我暂时找到了一个不好的解决方案。

    @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”(文件名)。我建立位置,将文件保存在本地,执行服务的逻辑(在我的情况下,我发送带有此文件的电子邮件)并从本地删除文件。

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

    【讨论】:

      猜你喜欢
      • 2013-06-07
      • 2011-11-10
      • 2020-01-20
      • 2013-07-16
      • 2013-02-03
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多