¿Cómo escribir un archivo en la carpeta de recursos / imágenes de la aplicación?

Me gustaría subir una imagen y almacenarla en el servidor, y luego mostrarla con h: graphicImage? Me gustaría almacenarlo en “recursos / imágenes” de la aplicación. Estoy usando glassfish 4. En este momento, el archivo va a “domain1 \ generated \ jsp \ FileUpload”. Gracias

Mi forma

      

Mi frijol

 @Named @ViewScoped public class UploadPage { private Part uploadedFile; public void uploadFile(){ File file = File.createTempFile("somefilename-", ".jpg", new File("C:\\var\\webapp\\images")); uploadedFile.write(file.getAbsolutePath()); } } 

Me gustaría almacenarlo en “recursos / imágenes” de la aplicación

No, por favor no. El espacio de despliegue de WAR no está destinado a ser una ubicación de almacenamiento permanente de archivos. Todos esos archivos cargados se perderán cada vez que vuelva a desplegar la aplicación web por la sencilla razón de que no están incluidos en la GUERRA original. Consulte también una explicación detallada de esta respuesta en una pregunta muy relacionada: La imagen cargada solo está disponible después de actualizar la página .


En este momento, el archivo va a “domain1 \ generated \ jsp \ FileUpload”.

Porque ha especificado una ruta relativa en Part#write() . Se vuelve relativo al directorio de trabajo actual sobre el que no tiene control. Vea para una explicación elaborada también esta respuesta relacionada: getResourceAsStream () vs FileInputStream . Debe especificar una ruta absoluta, en otras palabras, iniciar la ruta con / .


Dado que está utilizando Glassfish, la respuesta en Imagen cargada solo disponible después de actualizar la página también debería hacerlo por usted. En una palabra:

  1. Cree una carpeta /var/webapp/images . Tenga en cuenta que este camino es solo ejemplar y completamente gratuito para su elección. También tenga en cuenta que cuando usa Windows con un disco C:\ , esta ruta es equivalente a C:\var\webapp\images .

  2. Guarde el archivo cargado allí.

     Path file = Files.createTempFile(Paths.get("/var/webapp/images"), "somefilename-", ".jpg", ); try (InputStream input = uploadedFile.getInputStream()) { Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING); } imageFileName = file.getFileName().toString(); // ... 

    (Nota: Files#createTempFile() se usa para autogenerar un nombre de archivo único; de lo contrario, un archivo previamente subido se sobrescribirá cuando el nuevo archivo cargado (por coincidencia) tenga exactamente el mismo nombre de archivo)

  3. Indique a GlassFish que registre un host virtual en /var/webapp/images para que todos los archivos estén disponibles en http://example.com/images agregando la siguiente entrada a /WEB-INF/glassfish-web.xml de la aplicación web:

      

    (Nota: alternatedocroot_1 debe ser exactamente así, mantenerlo sin modificar, si tiene múltiples, asígnele el nombre alternatedocroot_2 , etc., también tenga en cuenta que la parte /images no debería incluirse en el atributo dir , esto no es un error tipográfico)

  4. Ahora puede mostrarlo de la siguiente manera:

      

    (nota: uso atributo de value , no atributo de name )

No pude hacer que funcione con Path#write in glassfish, así que utilicé Path#getInputStream siguiente manera:

 public void upload(){ BufferedInputStream bis = null; BufferedOutputStream bos = null; try { String filename = getFilename(uploadedFile); File file = new File("/var/webapp/images/"+filename); bis = new BufferedInputStream(uploadedFile.getInputStream()); FileOutputStream fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); int x; while((x = bis.read())!= -1){ bos.write(x); } } catch (IOException ex) { Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); } finally{ try { bos.flush(); bos.close(); bis.close(); } catch (IOException ex) { Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); } } } private static String getFilename(Part part) { for (String cd : part.getHeader("content-disposition").split(";")) { if (cd.trim().startsWith("filename")) { String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", ""); return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); // MSIE fix. } } return null; }