2012-04-20 37 views
9

Tôi đang sử dụng PrimeFaces 3.2 và tôi nên lưu trữ tệp trên hệ thống tệp. Bây giờ, tôi biết rằng lớp FileUploaded tạo ra một tệp tạm thời vì vậy tôi sẽ chuyển đổi nó thành một tệp thực sự bằng cách sử dụng java.io.File.Chuyển đổi tệp đã tải lên thành một tệp

Dưới đây là mã của tôi:

String fileName = "D:/upload/file.zip"; //--- this is an example, in my real code it is dynamic 
UploadedFile uploadedFile; 

//--- getters and setters 
InputStream in = uploadedFile.getInputStream(); 
OutputStream out = new FileOutputStream(new File(fileName)); 

int read = 0; 
byte[] bytes = new byte[1024]; 

while ((read = in.read(bytes)) != -1) { 
    out.write(bytes, 0, read); 
} 

in.close(); 
out.flush(); 
out.close(); 

Vấn đề là vào thư mục ứng dụng tạo ra một tập tin .tmp nhưng sau khi nó không phải là "chuyển đổi" vào tập tin mà tôi muốn! Lợi nhuận log:

[#|2012-04-20T16:30:13.109+0200|SEVERE|glassfish3.1.1|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=114;_ThreadName=Thread-2;|java.io.FileNotFoundException: D:\upload\file.zip (Impossibile trovare il percorso specificato) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:212) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:165) 
    at it.cyborg.cdg.jsfClasses.AbstractController.copyFile(AbstractController.java:240) 
    at it.cyborg.cdg.jsfClasses.ProgettiController.create(ProgettiController.java:223) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.sun.el.parser.AstValue.invoke(AstValue.java:234) 
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) 
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:43) 
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:56) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) 
    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:794) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
    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:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) 
    at it.cyborg.cdg.logic.RolesFilter.doFilter(RolesFilter.java:122) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:722) 
|#] 

Tôi cũng đã cố gắng giải pháp này:

How to get java.io.File from Apache's UploadedFile class?

Nhưng tôi nhận được lỗi tương tự. Cảm ơn sự giúp đỡ của bạn!

Trả lời

4

Tôi đã gặp vấn đề tương tự trước đây, nó rất đơn giản, Bạn chỉ cần tạo một Tệp mới cho nó. Nhưng trước tiên, bạn nên xác nhận đường dẫn mà bạn muốn viết có sẵn. Đây là mã mẫu

//This is used for new file creation. 
File f = new File(ParentPath, FileName); 
FileOutputStream fos = new FileOutputStream(f); 

Hoặc bạn chỉ có thể sử dụng java.nio.Files cho nó.

Files.newOutputStream(path, options); 

Vui lòng kiểm tra javadoc cho nó.

+0

cảm ơn câu trả lời của bạn! Tôi nên tạo theo cách thủ công con đường cũng cho giải pháp của vấn đề của tôi! – Filippo1980

+0

@ Filippo1980, Bạn được hoan nghênh. –

1

Bạn cũng có thể sử dụng mã này để chuyển đổi tệp UploadedFile thành tệp java.

File f = new File(uploadedFile.getFileName()); 
1
try { 
      moveFile(file.getInputstream(), file.getFileName()); 
     } catch (IOException e1) { 
      System.out.println(e1); 
     } 


private Boolean moveFile(InputStream inputStream, String name) { 

    OutputStream outputStream = null; 
    String path = "/Users/barry/Desktop/"; 
    Boolean flag = false; 
    try { 

     outputStream 
       = new FileOutputStream(new File(path + name)); 

     int read = 0; 
     byte[] bytes = new byte[1024]; 

     while ((read = inputStream.read(bytes)) != -1) { 
      outputStream.write(bytes, 0, read); 
     } 

     System.out.println("Done!"); 
     flag = true; 
    } catch (IOException e) { 
     flag = false; 
    } finally { 
     if (inputStream != null) { 
      try { 
       inputStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (outputStream != null) { 
      try { 
       // outputStream.flush(); 
       outputStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 
    return flag; 
}