1

祝大家有美好的一天!

我一直在使用 Netbeans、JSF 和 Primefaces 制作一个简单的 Web 应用程序,可以上传 .csv、.jpeg/.jpg 和 .pdf 文件。我制作了 2 个文件夹,它们存储在驱动器 C 中:(上传的文件夹和 tmp 文件夹)。

我将“上传”文件夹分配到存储上传文件的位置,并将“tmp”分配给上传文件的 .tmp。我已经正确遵循了许多问题线程和视频教程。

我还下载了 commons fileupload 和 commons io 并将其添加到库中。它工作正常,它显示它正在上传,甚至在我分配给它的文件夹上看到了 .tmp 文件。

但我无法在“已上传”文件夹中看到已上传的文件。 所以,我的问题是如何将这些文件上传到我的“上传”文件夹中。

这是我的代码:

索引.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<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>Facelet Title</title>
</h:head>
<h:body>
    <h:form enctype="multipart/form-data" >  

        <p:fileUpload fileUploadListener="#{FileUploadControl.fileUploadControl}"  
                      mode="advanced"  
                      update="messages"  
                      auto="true"  
                      sizeLimit="10000000"   
                      allowTypes="/(\.|\/)(gif|jpe?g|csv|pdf)$/"
                      />  

        <!-- -->

        <p:growl id="messages" showDetail="true"/>  
    </h:form> 
</h:body>
</html>    

文件上传控制.java

package controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.UploadedFile;


@ManagedBean
@SessionScoped
public class FileUploadControl implements Serializable {

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

public UploadedFile getFile() {
    return file;
}

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

public FileUploadControl() {
}

public void TransferFile(String fileName, InputStream in) {
    try {
        OutputStream out = new FileOutputStream(new File(destination + fileName));
        int reader = 0;
        byte[] bytes = new byte[(int) getFile().getSize()];
        while ((reader = in.read(bytes)) != -1) {
            out.write(bytes, 0, reader);
        }
        in.close();
        out.flush();
        out.close();
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}

public void upload() {
    String extValidate;
    if (getFile() != null) {
        String ext = getFile().getFileName();
        if (ext != null) {
            extValidate = ext.substring(ext.indexOf(".")+1);
        } else {
            extValidate = "null";

            if (extValidate.equals("pdf")) {
                try {
                    TransferFile(getFile().getFileName(), getFile().getInputstream());
                } catch (IOException ex) {
                         Logger.getLogger(FileUploadControl.class.getName()).log(Level.SEVERE, null, ex);
                    FacesContext context = FacesContext.getCurrentInstance();
                    context.addMessage(null, new FacesMessage("Wrong", "Error Uploading     file..."));
                }
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Succesful",     getFile().getFileName() + "is uploaded."));
            } else {
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Wrong_ext", "only extension .pdf"));
            }
        }
    } else {
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Wrong", "Select File!"));
    }
}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

<!--File upload commons -->
<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>C:\tmp</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<!--File upload commons -->

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>



<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<welcome-file-list>
    <welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>

感谢您的回复和帮助。期待它!

4

1 回答 1

1

它现在失败的主要原因是您没有将value属性绑定到您的支持 bean 变量,因此getFile()将始终返回 null 并且upload什么也不做。

您仍然可能不会得到任何结果,因为您似乎正在尝试组合<p:fileUpload/>组件的两种不同操作模式。

  1. 简单模式

    • 你没有定义一个fileUploadListener
    • 您在组件上定义一个value属性并绑定到UploadedFile支持 bean 中的 type 属性(您拥有)
  2. 高级模式

    • 您没有定义value属性
    • 您定义一个fileUploadListener绑定到您的支持 bean 中的方法(您也有)
于 2013-06-05T04:47:24.610 回答