2012-04-20 31 views
9

Uso PrimeFaces 3.2 e dovrei memorizzare un file sul filesystem. Ora, so che la classe FileUploaded crea un file temporaneo quindi lo convertirò in un file reale usando java.io.File.Convertire un file caricato in un file

Qui è il mio codice:

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(); 

Il problema è che nella cartella dell'applicazione creare un file TMP, ma dopo non è "convertire" al file che voglio! I rendimenti di registro:

[#|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) 
|#] 

ho provato anche questa soluzione:

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

ma ho ricevuto lo stesso errore. Grazie per il vostro aiuto!

risposta

4

Ho incontrato il problema simile prima, è molto semplice, è sufficiente creare un nuovo file per questo. Ma in primo luogo, dovresti confermare che il percorso che vuoi scrivere sia disponibile. Ecco il codice di esempio

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

o si può semplicemente utilizzare java.nio.Files per esso.

Files.newOutputStream(path, options); 

Si prega di verificare javadoc per esso.

+0

grazie per la vostra risposta! Dovrei creare manualmente il percorso anche per la soluzione del mio problema! – Filippo1980

+0

@ Filippo1980, prego. –

1

È inoltre possibile utilizzare questo codice per convertire un file caricato in un file 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; 
} 
Problemi correlati