Ошибка местоположения загрузки файла Primefaces

Я пытаюсь загрузить файл изображения в локальную папку и получаю сообщение об ошибке «Файл не найден». Местоположение, указанное в сообщении об ошибке для загружаемого файла, неверно. На самом деле местоположение файла, отображаемое при ошибке, является комбинацией моего исходного и конечного местоположения. Я пытаюсь загрузить файл на «C: / Users / sam // File / Upload /» со своего рабочего стола. Вот код ошибки,

Сообщение об ошибке

java.io.FileNotFoundException: C:\Users\sam\File\Upload\C:\Users\sam\Desktop\test.jpg (The filename, directory name, or volume label syntax is incorrect)

Мой файл класса

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import org.apache.commons.io.IOUtils;
import org.primefaces.event.FileUploadEvent;

@ManagedBean
public class FileUploadView {
private String fileUploadFolder = "C:/Users/sam/File/Upload/";

public void handleFileUpload(FileUploadEvent event) {
    FacesMessage message = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
    FacesContext.getCurrentInstance().addMessage(null, message);

    try {
        File targetFolder = new File(fileUploadFolder);
        InputStream input = event.getFile().getInputstream();
        OutputStream output = new FileOutputStream(new File(targetFolder,
                event.getFile().getFileName()));
        try {
            IOUtils.copy(input, output);
        } finally {
            IOUtils.closeQuietly(input);
            IOUtils.closeQuietly(output);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }  

}

}

и мой HTML

    <p:fileUpload fileUploadListener="#{fileUploadView.handleFileUpload}"
        mode="advanced" dragDropSupport="false" update="messages"
        sizeLimit="100000000" fileLimit="1"
        allowTypes="/(\.|\/)(gif|jpe?g|png|xlsx|jpg)$/" />

Я также пробовал пример из BalusC, но все же получение той же ошибки, пользовательский интерфейс с Primefaces 5.1.


person SamK    schedule 24.02.2015    source источник
comment
Ваш пример работает для меня, как и ожидалось, без каких-либо проблем. Я использовал Mojarra 2.2.9 + Tomcat 7 + Primefaces 5.1. Копирование файла выполнено успешно.   -  person pL4Gu33    schedule 24.02.2015
comment
@ pL4Gu33-Я знаю, что это странная проблема, она работала раньше, и теперь я начинаю понимать проблему. У меня такая же Mojarra 2.2.9 + Tomcat 7 + Primefaces 5.1. Есть ли другое место, которое вы рекомендуете проверить?   -  person SamK    schedule 24.02.2015
comment
Мне интересно, почему я получаю такое расположение файла C: \ Users \ sam \ File \ Upload \ C: \ Users \ sam \ Desktop \ test.jpg? Есть опечатка, которую я не могу понять?   -  person SamK    schedule 24.02.2015
comment
Хорошо, я понял, что эта проблема возникает только с IE8, который у меня есть в моей системе. В Forefox все работает нормально. Это баг от primefaces или jsf?   -  person SamK    schedule 25.02.2015
comment
IE - это не настоящий браузер @KodS, IE8 тем более   -  person kolossus    schedule 25.02.2015
comment
Это проблема безопасности IE8. Искать в Интернете. Ничего общего с jsf или праймфейсами   -  person Kukeltje    schedule 25.02.2015


Ответы (1)


На что указывает явно неправильный путь к файлу в исключении,

java.io.FileNotFoundException: C: \ Users \ sam \ File \ Upload \ C: \ Users \ sam \ Desktop \ test.jpg (неверное имя файла, имя каталога или синтаксис метки тома)

проблема в комбинации этого фрагмента кода

OutputStream output = new FileOutputStream(new File(targetFolder,
    event.getFile().getFileName()));

и тот факт, что использовался браузер MSIE. В этом браузере есть ошибка безопасности, заключающаяся в том, что он отправляет весь путь к файловой системе на диске на стороне клиента вместе с именем файла, а не только с именем файла.

Вам в основном нужно избавиться от этого пути к файловой системе на стороне клиента из имени файла.

String fileName = event.getFile().getFileName();
fileName = fileName.substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
OutputStream output = new FileOutputStream(new File(targetFolder, fileName));
// ...

Однако у вас здесь более серьезная проблема. Похоже, вы не учли возможность того, что несколько разных пользователей могут загрузить файл с точно таким же именем файла. Если вы хотите сделать свой код более надежным в этом отношении, перейдите на страницу Как сохранить загруженный файл в формате JSF.

person BalusC    schedule 25.02.2015
comment
В решении он по-прежнему указывает на тот же комбинированный путь к файлу. Я считаю, что вместо ('\\') может потребоваться (':'). Спасибо за подробное объяснение и руководство. Я могу переписать код на основе этого руководства. - person SamK; 25.02.2015