Me gustaría subir una imagen y almacenarla en el servidor, y más tarde para mostrar con h:graphicImage? Me gustaría guardarlo en «resources/images» de la aplicación. Estoy usando glassfish 4. Ahora, el archivo va a «domain1\generados\jsp\FileUpload». Gracias

Mi forma

<h:form id="form" enctype="multipart/form-data">
        <h:messages/>
        <h:panelGrid columns="2">
            <h:outputText value="File:"/>
            <h:inputFile id="file" value="#{uploadPage.uploadedFile}"/>
        </h:panelGrid>
        <br/><br/>
        <h:commandButton value="Upload File" action="#{uploadPage.uploadFile}"/>
</h:form>

Mi bean

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

    }
}

OriginalEl autor Pavel | 2013-10-02

2 Comentarios

  1. 23

    Me gustaría guardarlo en «resources/images» de la aplicación

    No, por favor, no. La GUERRA implementar el espacio no es pensado como permanente ubicación de almacenamiento de archivos. Todos los archivos subidos se pierden cada vez que se vuelva a implementar la webapp, por la simple razón de que no están contenidas en el original de la GUERRA. Véase, por una elaborada explicación también esta respuesta en un muy estrechamente relacionadas con la pregunta: Imagen subida disponible sólo después de la actualización de la página.


    Ahora, el archivo va a «domain1\generados\jsp\FileUpload».

    Porque ha especificado una ruta de acceso relativa en Part#write(). Se convierte en relativa al directorio de trabajo actual que usted no tiene ningún control. Véase, por una elaborada explicación también esta relacionada con la respuesta: getResourceAsStream() vs FileInputStream. Es necesario especificar una ruta de acceso absoluta, en otras palabras, empezar el camino con /.


    Dado que estás usando en Glassfish, la respuesta en Imagen subida disponible sólo después de la actualización de la página también debe hacerlo para usted. En pocas palabras:

    1. Crear un /var/webapp/images carpeta. Tenga en cuenta que esta ruta es sólo ejemplos y totalmente gratis, a tu elección. También tenga en cuenta que cuando usted está utilizando Windows con un C:\ disco, este camino es equivalente a C:\var\webapp\images.

    2. Guardar el archivo subido 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 utiliza para generar automáticamente un nombre de archivo único, de lo contrario, una subida previamente archivo se sobrescribe cuando el nuevo archivo subido (por casualidad) tiene exactamente el mismo nombre de archivo)

    3. Decir GlassFish para registrar un host virtual en /var/webapp/images de modo que todos los archivos están disponibles en http://example.com/images mediante la adición de la siguiente entrada /WEB-INF/glassfish-web.xml de la webapp:

      <property name="alternatedocroot_1" value="from=/images/* dir=/var/webapp" />

      (nota: alternatedocroot_1 debe ser exactamente así, mantener sin modificaciones, si tiene varios, el nombre alternatedocroot_2, etc; también tenga en cuenta que el /images parte no debería ser incluido en dir atributo, esto no es una errata)

    4. Ahora usted puede mostrar de la siguiente manera:

      <h:graphicImage value="/images/#{bean.imageFileName}" />

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

    Puedo conseguir java.io.FileNotFoundException para el Nº 2. y GRAVE: la empresa.de implementación.backend.invalidDescriptorFailure GRAVE: la empresa.de implementación.backend.saxParserError GRAVE: la Excepción, mientras que la implementación de la aplicación [FileUpload] GRAVE: la Excepción durante el ciclo de vida de procesamiento para el Nº 3
    Como a 2, asegúrese de que las carpetas ya están preparadas. Como a las 4, yo no he dicho que tiene que ir en web.xml. Tiene que ir en glassfish-web.xml. En Eclipse/Netbeans con el oficial de GlassFish plugin que ya debería ser autocreated en el proyecto cuando el proyecto está asociado con GlassFish como tiempo de ejecución de destino. De lo contrario, crear uno usted mismo.
    las carpetas se crean puedo conseguir java.io.FileNotFoundException: C:\glassfish4\glassfish\domains\domain1\generated\jsp\FileUpload\c:\var\webapp\images\somefilename-8202982476788377654.jpg (El nombre de archivo, nombre de directorio o etiqueta del volumen es incorrecto) y hay archivos en la carpeta, pero son de 0 bytes
    El camino es realmente malo. Debería haber sido c:\var\webapp\i‌​mages\somefilename-8202982476788377654.jpg
    Apache es el nombre de una empresa de software. Deduzco que te refieres a su Tomcat producto? Sin embargo, el servidor independiente de la forma en que se responde aquí: stackoverflow.com/q/18664579

    OriginalEl autor BalusC

  2. 1

    No era capaz de hacerlo funcionar con Path#write en glassfish, así que he usado Path#getInputStream de la 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;
    }

    OriginalEl autor Dapope

Dejar respuesta

Please enter your comment!
Please enter your name here