将 javax.servlet.http.Part 转换为 Java.io.File

Convert javax.servlet.http.Part to Java.io.File

我正在使用 java 8、maven 和 glassfish-server 开发网络应用程序。

我正在尝试使用以下代码将 Part 对象转换为 File 对象,以将其用于 javaMail 附件。

首先我的应用程序文件夹看起来像这样

还有我的代码:

public  void copyPartToFile() throws IOException{
    InputStream inputStream = part.getInputStream();
    String contentType = part.getContentType();
    String pathname = "GradePlus/Attachment/tmpFile."+ contentType.substring(contentType.lastIndexOf('/') +1);
    File copy = new File(pathname);
    OutputStream outputStream = new FileOutputStream(copy);
    try {
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }
    } finally {
        inputStream.close();
        outputStream.close();
    }
}

Stacktrace 说没有这样的文件或目录。

 #{fileBean.copyPartToFile}: java.io.FileNotFoundException:GradePlus/Attachment/tmpFile.csv (No such file or directory)
javax.faces.FacesException: #{fileBean.copyPartToFile}: java.io.FileNotFoundException: GradePlus/Attachment/tmpFile.csv (No such file or directory)
 at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
 at javax.faces.component.UICommand.broadcast(UICommand.java:315)
 at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
 at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
 at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
 at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
 at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
 at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
 at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1692)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:258)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
 at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:654)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:593)
 at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159)
 at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:371)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238)
 at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:483)
 at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:180)
 at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
 at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
 at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
 at org.glassfish.grizzly.filterchain.ExecutorResolver.execute(ExecutorResolver.java:119)
 at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
 at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
 at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
 at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
 at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
 at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
 at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
 at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
 at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access0(WorkerThreadIOStrategy.java:56)
 at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
 at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
 at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
 at java.lang.Thread.run(Thread.java:745)
Caused by: javax.faces.el.EvaluationException: java.io.FileNotFoundException: GradePlus/Attachment/tmpFile.csv (No such file or directory)
 at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
 at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
 ... 35 more
Caused by: java.io.FileNotFoundException:GradePlus/Attachment/tmpFile.csv (No such file or directory)
 at java.io.FileOutputStream.open0(Native Method)
 at java.io.FileOutputStream.open(FileOutputStream.java:270)
 at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
 at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
 at controller.FileBean.copyPartToFile(FileBean.java:132)
 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 com.sun.el.parser.AstValue.invoke(AstValue.java:289)
 at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
 at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
 at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
 at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
 at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
 ... 36 more
]]

[2018-03-02T20:08:55.497+0100] [Payara 4.1] [WARNUNG] [] [javax.enterprise.web] [tid: _ThreadID=28 _ThreadName=http-thread-pool::http-listener-1(4)] [timeMillis: 1520017735497] [levelValue: 900] [[
  StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
java.io.FileNotFoundException: /Users/arbnor/Documents/Repositories/Software_Projekt2/GradePlus/GradePlus/Attachment/tmpFile.csv (No such file or directory)
 at java.io.FileOutputStream.open0(Native Method)
 at java.io.FileOutputStream.open(FileOutputStream.java:270)
 at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
 at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
 at controller.FileBean.copyPartToFile(FileBean.java:132)
 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 com.sun.el.parser.AstValue.invoke(AstValue.java:289)
 at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
 at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
 at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
 at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
 at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
 at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
 at javax.faces.component.UICommand.broadcast(UICommand.java:315)
 at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
 at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
 at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
 at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
 at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
 at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
 at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1692)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:258)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
 at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:654)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:593)
 at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159)
 at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:371)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238)
 at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:483)
 at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:180)
 at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
 at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
 at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
 at org.glassfish.grizzly.filterchain.ExecutorResolver.execute(ExecutorResolver.java:119)
 at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
 at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
 at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
 at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
 at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
 at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
 at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
 at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
 at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access0(WorkerThreadIOStrategy.java:56)
 at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
 at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
 at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
 at java.lang.Thread.run(Thread.java:745)

我错过了什么?

您使用的是相对路径名。该名称与 GlassFish 服务器的启动目录相关。 GradePlus/Attachment 目录可能在那里不存在。最好使用绝对路径名,这样您就可以准确知道文件的最终位置。

由于这只是一个临时文件,请考虑使用 File.createTempFile method

另请注意,您可以使用 MimeBodyPart.saveFile method.

简化代码