2015-11-13 4 views
2

Привет всем, у меня есть проблемы с загрузкой большего количества файлов в PrimeFaces/Jsf2primefaces5 jsf2 множественной загрузка электронного просканировать элементы

Я вижу http://www.primefaces.org/showcase/ui/file/upload/multiple.xhtml

Когда метод перехватывать события, связанный я установить

UploadedFile fileUpload = event.getFile();

и я хочу, чтобы сканировать все файлы, загруженные с реализацией Списка

InputStream input; 
    input = event.getFile().getInputstream(); 
    pojo.setFileInputStream(input); 
    input.close(); 
    fileTableList.add(pojo); 

Но большой проблемой является то, что этот список содержит только один файл загружено. Как я могу взять каждый файл, загруженный из события UploadedFile?

Что случилось? Спасибо за ответы

+0

Вам нужно будет хранить 'InputStream' или' byte [] 'или даже' UploadedFile' в зависимости от необходимости извлекать из файлов, загружаемых в коллекцию или массив, то есть внутри 'fileUploadListener'. – Tiny

+0

Я так думаю, но каждый i-элемент байтового массива - это UploadedFile? – Alex

+0

Моя проблема в том, что я управляю именем каждого файла, загруженного с предыдущим файлом, поэтому мне нужен список имен каждого файла. – Alex

ответ

0

Но большая проблема в том, что этот список содержит только один файл закачанных. Как я могу взять каждый файл, загруженный с UploadedFile событие?

Это не может быть воспроизведено с минимальным примером с наименьшими возможными зависимостями/ресурсами, если вы явно не укажете с минимальным воспроизводимым примером.


Создайте класс утилиты следующим образом (класс полностью зависит от требования).

public class FileUtil implements Serializable { 

    private InputStream inputStream; // One can also use byte[] or something else. 
    private String fileName; 
    private static final long serialVersionUID = 1L; 

    public FileUtil() {} 

    // Overloaded constructor(s) + getters + setters + hashcode() + equals() + toString(). 
} 

Управляемая боб получать несколько файлов:

@Named 
@ViewScoped 
public class TestBean implements Serializable { 

    private List<FileUtil> fileList; 
    private static final long serialVersionUID = 1L; 

    public TestBean() {} 

    @PostConstruct 
    public void init() { 
     fileList = new ArrayList<>(); 
    } 

    public void fileUploadListener(FileUploadEvent event) throws IOException { 
     UploadedFile file = event.getFile(); 
     FileUtil fileUtil = new FileUtil(); 
     fileUtil.setInputStream(file.getInputstream()); 
     fileUtil.setFileName(file.getFileName()); 
     fileList.add(fileUtil); 
    } 


    // Bound to a <p:commandButton>. 

    public void action() { 
     for (FileUtil fileUtil : fileList) { 
      System.out.println(fileUtil.getFileName()); 
     } 

     // Use the list of files here and clear the list afterwards, if needed. 
     fileList.clear(); 
    } 
} 

XHTML файл, содержащий только <p:fileUpload> и <p:commandButton> только ради демонстрации.

<h:form id="form"> 
    <p:fileUpload id="fileUpload" 
        mode="advanced" 
        fileLimit="5" 
        multiple="true" 
        allowTypes="/(\.|\/)(gif|jpe?g|png)$/" 
        sequential="true" 
        process="@this" 
        fileUploadListener="#{testBean.fileUploadListener}"> 
    </p:fileUpload> 

    <p:commandButton value="Submit" 
        process="@this" 
        update="fileUpload" 
        actionListener="#{testBean.action}"/> 
</h:form> 

Если вам нужно byte[] вместо InputStream, а затем просто изменить private InputStream inputStream; в FileUtil класса byte[], а затем использовать

byte[] bytes = IOUtils.toByteArray(uploadedFile.getInputstream()); 

извлечь байтовый массив из InputStream (где IOUtils является от org.apache.commons.io. Вы также можете сделать это вручную, написав несколько строк кода).

Вы также можете построить List<UploadedFile> без создания дополнительного класса, как FileUtil как в этом примере, но сделать это будет санкционировать зависимость PrimeFaces на уровне услуг (что не должно произойти), если вы случайно использовать этот слой в вашем приложении , так как UploadedFile является артефактом PrimeFaces. В конце концов, это полностью зависит от требования.

+0

thank Tiny, проблема в том, что я не могу управлять работой над каждым файловым именем, потому что есть только один istance, который содержит все имена файлов; Я также думал, что байт [], но мое приложение остается в облачной системе, и я не могу писать в физической памяти. – Alex

+0

Я не получаю термин «Контроль работы *». – Tiny

+0

Последовательный контроль над именами файлов .. Я хочу перебрать список файлов имен. Список FileUtil не повторяется в каждом имени файла – Alex