Primefaces文件上传位置错误

时间:2015-02-24 19:17:36

标签: internet-explorer file-upload jsf-2 primefaces filenotfoundexception

我正在尝试将图像文件上传到本地文件夹并获取“找不到文件”错误。上传文件的错误消息中指出的位置不正确。实际上,错误上显示的文件位置是我的源位置和目标位置的组合。我正在尝试从我的桌面上传文件到“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)$/" />

我也试过example from BalusC,仍然得到相同的错误,ui和primefaces5.1。

1 个答案:

答案 0 :(得分:3)

正如异常中明显错误的文件路径暗示的那样,

  

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));
// ...

然而,你在这里遇到了更大的问题。您似乎没有考虑过多个不同用户可以上传文件名完全相同的文件的可能性。如果您希望使代码更加健壮,请转到How to save uploaded file in JSF