为什么这个简单的文件上传不起作用? JSF

时间:2010-05-24 03:45:57

标签: java jsf

为什么这段代码不起作用?每当我上传文件时,我总是得到size()= 0。

xhtml文件: -

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Abc</title>

    </h:head>
    <h:body>
        <center>

            <form method="post" enctype="multipart/form-data" id="form" action="/upload/uploadFile">
                    <input type="file"/>    <br/>
                    <input type="Submit" value="upload"/>
            </form>

        </center>
    </h:body>
</html>

这是我的servlet: -

package servlets;

import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


@WebServlet(name="uploadFile", urlPatterns={"/uploadFile"})
public class uploadFile extends HttpServlet {


    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, FileUploadException {
        System.out.println("executed!");
        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        System.out.println(items.size());
         for (FileItem item : items) {
                if (!item.isFormField()) {
                    System.out.println("Name: " + item.getName());
                    System.out.println("Size: " + item.getSize());
                    System.out.println("Type: " + item.getContentType());
                }
            }
    } 


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (FileUploadException ex) {
            ex.printStackTrace();
        }
    } 


    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (FileUploadException ex) {
            ex.printStackTrace();
        }
    }


    @Override
    public String getServletInfo() {
        return "Short description";
    }

}

更新

1)如果我只是将{name =“something”添加到input type = "file",那么它可以正常工作。这背后有什么逻辑?

2)如果我使用h:form而不是form,那么它就不起作用(即使我的actionListener方法也没有被执行)。这有什么原因?我读到h:form不是为处理multipart / form-data请求而设计的。这是真的吗?

2 个答案:

答案 0 :(得分:2)

  

1)如果我只是将name =“something”添加到input type =“file”,那么它工作正常。这背后有什么逻辑:d?

需要使用名称来区分提交的值与其他值 - 否则,您将如何识别请求中的参数?

  

2)如果我使用h:form而不是form,那么它就不起作用(即使我的actionListener方法也没有被执行)。这有什么原因?我读到h:form不是为处理multipart / form-data请求而设计的。这是真的吗?

您正在尝试混合使用JSF控件和纯HTML元素。如果你没有点击JSF servlet,不要指望执行JSF生命周期。 JSF表单可以支持文件上传 - 许多JSF组件库提供了这样的控件。

答案 1 :(得分:1)

我看到你正在使用Servlet 3.0。它采用了HttpServletRequest#getParts()方法背后的Commons FileUpload。您可以阅读here应该如何使用它。

由于JSF 2.0更容易创建自定义组件而且Tomahawk还没有准备好JSF 2.0(通常选择t:inputFileUpload来创建JSF文件上传组件),您还可以考虑创建自定义文件上传组件你自己。这在this article中有详细介绍。


也就是说,自1998年以来,HTML <center>元素已弃用。您希望在包含块元素上使用CSS样式margin: 0 auto;