2012-04-20 28 views
9

Estoy usando PrimeFaces 3.2 y debo almacenar un archivo en el sistema de archivos. Ahora, sé que la clase FileUploaded crea un archivo temporal para convertirlo en un archivo real usando java.io.File.Convertir un archivo cargado en un archivo

aquí está mi código:

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

El problema es que en la carpeta de la aplicación crea un archivo .tmp pero después de que no es "convertir" en el archivo que quiero! Los rendimientos de 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) 
|#] 

me trataron también esta solución:

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

Pero recibieron el mismo error. ¡Gracias por tu ayuda!

Respuesta

4

Me encontré con el problema similar antes, es muy simple, solo necesita crear un nuevo archivo para él. Pero, en primer lugar, debe confirmar que la ruta que desea escribir está disponible. Aquí es el código de ejemplo

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

o simplemente puede usar java.nio.Files por ello.

Files.newOutputStream(path, options); 

favor verifique javadoc para ello.

+0

gracias por su respuesta! ¡Debería crear manualmente la ruta también para la solución de mi problema! – Filippo1980

+0

@ Filippo1980, De nada. –

1

También puede usar este código para convertir un archivo cargado en un archivo 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; 
} 
Cuestiones relacionadas