【问题标题】:Upload an image to a Path set in web.xml using primefaces使用 primefaces 将图像上传到 web.xml 中设置的路径
【发布时间】:2013-12-23 13:13:18
【问题描述】:

我已经查阅了 stackoverflow 上关于在 primefaces 中上传图像的大部分帖子。有了这个帮助,我已经能够将图像上传到代码中静态指定的目标路径,如本文所示。 save image file in specific directory jsf primefaces project。这很好用。

但是,我希望将图像上传到 web.xml 中指定的目标路径。这是因为我希望即使在部署应用程序之后路径也是可配置的。当我使用 ServletContext#getRealpath() 时,返回路径位于 myProject 文件夹中,但我希望目标路径完全位于项目外部,因为我发现它是最好的方法。例如 E:/myUploads

这是我的 web.xml

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    <init-param>
        <param-name>thresholdSize</param-name>
        <param-value>51200</param-value>
    </init-param>
    <init-param>
        <param-name>uploadDirectory</param-name>
        <param-value>E:/myUploads</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

这是我的豆子。

public void handleFileUpload(FileUploadEvent event){
  //get uploaded file from the event
  UploadedFile uploadedFile = (UploadedFile) event.getFile();
  //create an InputStream from the uploaded file
  InputStream inputStr = null;
  try 
 {
    inputStr = uploadedFile.getInputstream();
    } catch (IOException e) {
        //log error
    }

  ServletContext servletContext =      (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();
  String uploadPath = servletContext.getRealPath("");
  File destFile = new File(uploadPath);

//use org.apache.commons.io.FileUtils to copy the File
    try {
        FileUtils.copyInputStreamToFile(inputStr, destFile);
    } catch (IOException e) {
        //log error
    }
    FacesMessage msg = new FacesMessage(event.getFile().getFileName() + " is uploaded.");
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

我的愿望是将上传的图片保存在 E:/myUploads 中,而不必说:

String destPath = "E:\\myUploads\\" + uploadedFile.getFileName(); 

如果你也告诉我如何使用显示上传的图像,我会很高兴

<p:graphicImage

【问题讨论】:

    标签: file-upload jsf-2 primefaces


    【解决方案1】:

    uploadDirectory 初始化参数表示上传文件大于配置的阈值大小时的临时文件存储位置。配置的目录不打算作为永久文件存储位置。它会在您无法控制的时刻自动清洁。

    完全摆脱它并创建一个独立的上下文参数。

    <context-param>
        <param-name>uploadDirectory</param-name>
        <param-value>E:/myUploads</param-value>
    </context-param>
    

    然后就可以使用了

    String directory = externalContext.getInitParameter("uploadDirectory"); 
    String filename = FilenameUtils.getName(uploadedFile.getFileName());
    File file = new File(directory, filename);
    // ...
    

    您确实不应该永远使用getRealPath()。顺便说一句,当另一个用户碰巧上传具有相同文件名的文件时,您会遇到另一个潜在问题。您可以使用File#createTempFile() 自动生成具有固定前缀/后缀的唯一文件名。另见How to save uploaded file in JSF

    【讨论】:

    • 让我用这个来问你一些事情 BalusC。我可能这样做不专业,但我会感谢你的回应。我意识到你在这里给出正确答案的能力最高。你能和我分享一下你做了什么来确保你知道大部分事情吗?我肯定佩服你。哪些原则指导您的知识库,您使用哪些材料?当涉及到许多事情时,你有很深的知识,但有些人总是知道表面信息。我是一名 Java EE、JPA、Primefaces 爱好者,你是我的动力,是我敬仰的人,也是我经常谈论的例子...... Prior Thanx。
    【解决方案2】:

    BalusC Answer 对我帮助很大。再次感谢 BalusC。如果有人对最终代码感兴趣,这里是......

    我正在使用工具 Netbeans 7.4、Primefaces 4.0、GlassFish 3.1.2

    这是我的上传表单。

    <h:form  enctype="multipart/form-data">  
            <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}" mode="advanced" dragDropSupport="false"  
                          update="messages" sizeLimit="100000" fileLimit="3" allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />  
            <p:messages id="messages" showDetail="true"/>  
    
        </h:form>  
    

    我的库中有 Apache Commons 库

    commons-io-2.4.jar  (http://commons.apache.org/io)
    commons-fileupload-1.3.jar  (http://commons.apache.org/fileupload)
    

    我的 web.xml 中有这个

    <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
        <init-param>
            <param-name>thresholdSize</param-name>
            <param-value>51200</param-value>
        </init-param>
    </filter>
    
    <context-param>
        <param-name>uploadDirectory</param-name>
        <param-value>E:/myUploads</param-value>
    </context-param>
    
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
    

    这是我的文件上传控制器

    @ManagedBean(name = "fileUploadController")
    @ViewScoped
    public class FileUploadController {
    
    public void handleFileUpload(FileUploadEvent event) {
        //get uploaded file from the event
        UploadedFile uploadedFile = (UploadedFile) event.getFile();
        //create an InputStream from the uploaded file
        InputStream inputStr = null;
        try {
            inputStr = uploadedFile.getInputstream();
        } catch (IOException e) {
            //log error
        }
    
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        String directory = externalContext.getInitParameter("uploadDirectory");
        String filename = FilenameUtils.getName(uploadedFile.getFileName());
        File destFile = new File(directory, filename);
    
        //use org.apache.commons.io.FileUtils to copy the File
        try {
            FileUtils.copyInputStreamToFile(inputStr, destFile);
        } catch (IOException e) {
            //log error
        }
        FacesMessage msg = new FacesMessage(event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
    

    }

    这很好用。一切顺利。

    【讨论】:

    • 我确实复制了代码但是这一行FileUtils.copyInputStreamToFile(inputStr, destFile);找不到方法copyInputStreamToFileimportorg.apache.commons.io.FileUtils;使用 commons-io-2.4 Netbeans 7.4、Primefaces 4.0、GlassFish 4.0
    猜你喜欢
    • 1970-01-01
    • 2012-09-16
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多