【问题标题】:Why is this simple file upload not working? JSF为什么这个简单的文件上传不起作用? JSF
【发布时间】:2010-05-24 03:45:56
【问题描述】:

为什么这段代码不起作用?每当我上传文件时,我总是得到 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 不是为处理多部分/表单数据请求而设计的。是真的吗?

【问题讨论】:

标签: java jsf


【解决方案1】:

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

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

2) 如果我使用 h:form 而不是 form,那么它就不起作用(甚至我的 actionListener 方法也没有被执行)。这背后有什么原因?我读到 h:form 不是为处理多部分/表单数据请求而设计的。是真的吗?

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

【讨论】:

    【解决方案2】:

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

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


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

    【讨论】:

    • 太棒了!回答 Balus C.信息量很大。从下次开始,我会注意不要使用
    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 2011-10-25
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多