Cómo guardar los archivos subidos en JSF

Estoy subiendo un archivo en JSF. Yo estoy usando el Tomahawk del <t:inputFileUpload> para esto, pero la misma pregunta se aplica, por ejemplo, PrimeFaces <p:fileUpload> y JSF 2.2 <h:inputFile>.

Tengo el siguiente backing bean código:

private UploadedFile uploadedFile; //+getter+setter

public String save() throws IOException {
    String name = uploadedFile.getName();
    System.out.println("File name: " + name);

    String type = uploadedFile.getContentType();
    System.out.println("File type: " + type);

    long size = uploadedFile.getSize();
    System.out.println("File size: " + size);  

    InputStream stream = uploadedFile.getInputStream();
    byte[] buffer = new byte[(int) size];  
    stream.read(buffer, 0, (int) size);  
    stream.close();  
}

Soy capaz de conseguir el nombre de archivo, el tipo y tamaño, pero soy incapaz de guardar este archivo en una ruta específica. No puedo entender la forma correcta de guardar el archivo cargado. ¿Cómo puedo lograr esto?

agregar más detalles.post completo código
he editado con el código, me estoy poniendo de nombre de archivo, pero ¿cómo puedo subir ot server , u know?
utiliza Myfaces..a la derecha?
sí, JSF1.1. Y quiero guardar el archivo local @servidor con particular url
¿qué es el error?

OriginalEl autor V.Rohan | 2013-01-08

2 Kommentare

  1. 50

    La getInputStream() método de la subida de archivos representa el contenido del archivo.

    InputStream input = uploadedFile.getInputStream();

    Necesita copiar a un archivo. Debe prepararse una carpeta en el disco local del sistema de archivos donde los archivos subidos deben ser almacenados. Por ejemplo, /path/to/uploads (en Windows, que sería en el mismo disco donde se ejecuta el servidor). Tenga en cuenta que usted debe absolutamente no almacenar los archivos en la ampliación de la GUERRA de la carpeta mediante una ruta relativa o getRealPath() por las razones que se mencionan aquí Imagen subida disponible sólo después de la actualización de la página.

    Entonces, usted necesita para generar automáticamente el nombre de archivo. De lo contrario, cuando alguien carga un archivo con coincidentemente el mismo nombre, más tarde, se sobrescribirán. Usted podría utilizar Archivos#createTempFile() facilidad para obtener un nombre de archivo generado automáticamente.

    Path folder = Paths.get("/path/to/uploads");
    String filename = FilenameUtils.getBaseName(uploadedFile.getName()); 
    String extension = FilenameUtils.getExtension(uploadedFile.getName());
    Path file = Files.createTempFile(folder, filename + "-", "." + extension);

    El camino a la carga podría en caso de ser necesario con parámetros basados en una de las varias formas que se muestra en este Q&A: Forma recomendada para guardar los archivos subidos en un servlet aplicación. El FilenameUtils es parte de Apache Commons IO que usted ya debe tener en su classpath como es una dependencia de la Tomahawk cargar el archivo de componente.

    Por último, el flujo de la subida de archivos a archivo (suponiendo Java 7):

    try (InputStream input = uploadedFile.getInputStream()) {
        Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING);
    }
    
    System.out.println("Uploaded file successfully saved in " + file);

    Entonces, a descargar de nuevo, más fácil será registrar /path/to/uploads como una nueva webapp contexto o un host virtual para que todos los archivos están disponibles por medio de un URL. Véase también Cargar imágenes desde fuera de webapps /webcontext /implementar carpeta con <h:graphicImage> o <img> etiqueta.

    gracias, Y si quiero seleccionar varios archivos a la vez, entonces lo que tengo que prefieren?
    Eso no es posible con <t:inputFileUpload> que genera un viejo y simple HTML4 <input type="file">. Eso sólo es posible con Flash o HTML5 <input type="file" multiple="true">. RichFaces y PrimeFaces oferta de tales componentes. E. g. showcase.richfaces.org/richfaces/… y primefaces.org/showcase/ui/fileUploadMultiple.jsf
    Gracias, lo siento por el cuestionamiento más y más , pero, de cualquier otra forma, el uso de <t:inputFileUpload> ?
    Sólo el uso de múltiples <t:inputFileUpload> componentes o el uso en <h:dataTable> o <t:dataList> respaldado por una colección de UploadedFile.
    debido a un vacío de archivo temporal es físicamente creado (y por lo tanto ya existe) antes de escribir. Funciona de esta manera el sistema puede garantizar que ningún otro archivo temporal con coincidentemente mismo nombre será creado por otro hilo entre la creación y la escritura.

    OriginalEl autor BalusC

  2. 1

    PrimeFaces utiliza dos de carga de archivos decodificador para cargar el contenido de p:fileupload

    1. NativeFileUploadDecoder
    2. CommonsFileUploadDecoder

    NativeFileUploadDecoder es el valor predeterminado de carga decodificador y se requiere de un contenedor de servlets 3.0. Así que si su contenedor de servlets es menor que 3, entonces no va a trabajar con usted.
    También algunos servidores de aplicaciones hacer una restricción sobre el uso de multi-parte del contenido

    Así que si usted tiene un problema con el nativo de subir decodificador por alguna razón usted tiene que utilizar el otro decodificador que es «CommonsFileUploadDecoder»

    CommonsFileUploadDecoder depende de Apache común lib
    así que tienes que poner el commons-fileupload y commons-io frascos en su clase de la ruta
    la versión depende de su primefaces versión, sino 1.3 y 2.2 respectivamente funciona para mí.

    utilizar CommonsFileUploadDecoder usted tiene que utilizar el filtro

    <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>

    esperar que el filtro sólo no funcionará porque en el interior del filtro se comprueba en el cargador si su no y detectar al menos JSF 2.2 por lo que se omitirá la solicitud a la predeterminada decodificador «Nativo» y, a continuación, no va a funcionar para tu también

    para forzar el filtro a utilizar el común decodificador tienes que poner el siguiente contexto param en su web.xml

    <context-param>
    <param-name>primefaces.UPLOADER</param-name>
       <param-value>commons</param-value>
    </context-param>
    stackoverflow.com/questions/8875818/… la respuesta a este post
    No todo esta en la PrimeFaces documentación?

    OriginalEl autor HMoussa

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein