Где сохранен загруженный файл p: fileUpload и как его изменить?

Я использую простую загрузку файлов Primefaces в разработке с помощью Netbeans. Мой тестовый пример аналогичен руководству Primefaces.
Мой вопрос: где файл загружается на мой локальный компьютер? Как я могу изменить путь для него? спасибо!

Файл jsf:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Page test</title>
    </h:head>
    <h:body>
        Hello! My first JSF generated page!
        <h:form enctype="multipart/form-data">
            <p:fileUpload value="#{fileBean.file}" mode="simple" />
            <p:commandButton value="Submit" ajax="false"/>
        </h:form>

    </h:body>
</html>

и управляемый bean:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;


    @ManagedBean

@RequestScoped
public class FileBean {

    private UploadedFile file;

    public FileBean() {
    }

    public UploadedFile getFile() {
        return file;
    }

    public void setFile(UploadedFile file) {
        this.file = file;

    }
}

Ответ 1

Он по умолчанию сохраняется либо в памяти контейнера сервлетов, либо в папке temp в зависимости от размера файла и конфигурации Apache Commons FileUpload (см. также раздел "Конфигурация фильтра" главы <p:fileUpload> в Руководство пользователя PrimeFaces).

Вы не должны об этом беспокоиться. Контейнер сервлетов и PrimeFaces точно знают, что они делают. Вы должны в методе действий кнопки кнопки фактически сохранять содержимое загруженного файла в том месте, где вам нужно вам. Вы можете получить содержимое загруженного файла как InputStream на UploadedFile#getInputStream() или как byte[] на UploadedFile#getContents() (получение byte[] потенциально опасно дорого в случае больших файлов, вы знаете, что каждый byte ест один байт JVM-памяти, поэтому не делайте этого в случае больших файлов).

например.

<p:commandButton value="Submit" action="#{fileBean.save}" ajax="false"/>

с

private UploadedFile uploadedFile;

public void save() throws IOException {
    String filename = FilenameUtils.getName(uploadedFile.getFileName());
    InputStream input = uploadedFile.getInputStream();
    OutputStream output = new FileOutputStream(new File("/path/to/uploads", filename));

    try {
        IOUtils.copy(input, output);
    } finally {
        IOUtils.closeQuietly(input);
        IOUtils.closeQuietly(output);
    }
}

(FilenameUtils и IOUtils) из Commons IO, которые вы все равно должны были установить, чтобы получить <p:fileUpload> для работы)

Чтобы создавать уникальные имена файлов, вы можете найти File#createTempFile() средство.

String filename = FilenameUtils.getName(uploadedFile.getFileName());
String basename = FilenameUtils.getBaseName(filename) + "_";
String extension = "." + FilenameUtils.getExtension(filename);
File file = File.createTempFile(basename, extension, "/path/to/uploads");
FileOutputStream output = new FileOutputStream(file);
// ...

Ответ 2

Я использовал простой режим, GlassFish 4.0 и PrimeFaces 4.0

Поддержка Bean

private UploadedFile file;
private String destination="C:\\temp\\";

public void upload() {

    System.out.println("uploading");
    if(file != null) {  
        System.out.println("the file is" +file);
        FacesMessage msg = new FacesMessage("Succesful" + file.getFileName() + " is uploaded.");  
        FacesContext.getCurrentInstance().addMessage(null, msg);  

        try {
           copyFile(file.getFileName(), file.getInputstream());
       }
       catch (IOException e) {
          e.printStackTrace();
       }
    }
    System.out.println("uploaf finished");
}  

public void copyFile(String fileName, InputStream in) {
    try {
        // write the inputStream to a FileOutputStream
        OutputStream out = new FileOutputStream(new File(destination + 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();

        System.out.println("New file created!");
    } catch (IOException e) {
       System.out.println(e.getMessage());
    }
}

Страница JSF

<p:commandButton value="Submit" ajax="false" actionListener="#{staffController.upload}"/>