【问题标题】:Why am I getting null when I request the FileName?为什么我在请求 FileName 时得到空值?
【发布时间】:2013-01-19 08:01:53
【问题描述】:

以下 HTML sn-p 向 servlet SendFileName 发出 POST 请求。

<form method="post" action="SendTheFileName" enctype="multipart/form-data">
                <div id="Files_to_be_shared"> 
                      <input type="file" id="File" name="FileTag" />
                      <input type="submit" value="Share" /> 
                </div>
</form>

在 servlet 的 POST 方法中,我尝试通过调用来获取文件名:

String FileName = request.getParameter("FileTag")

但我收到了null。这是为什么 ?

我正在使用 Apache commons 进行文件上传。它工作正常。我不知道为什么当 enctype 是 multipart/form-data 而只使用 jdk 时我会得到 null。

【问题讨论】:

  • 你必须使用公共文件上传或类似的东西来解析请求。试试这些链接:commons.apache.org/fileupload
  • @Renjith 必须是什么意思?为什么返回null
  • 我认为问题出在 enctype 的 b'coz 上。它是 multipart/form-data
  • 您确定在正确的位置调用文件吗?尝试使用 "\SendTheFileName".getParameter 在参数不存在时返回 null。

标签: java html jakarta-ee file-upload enctype


【解决方案1】:

Servlet 3.0 API (Java EE 6) 提供了访问多部分帖子内容的方法:

HttpServletRequest.getParts() 您应该有一个 Part 用于文件,一个用于每个参数。

【讨论】:

    【解决方案2】:

    当您使用enctype="multipart/form-data" 时,所有表单参数将作为多部分传输。

    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    List items = upload.parseRequest(request);
    
    // Process the uploaded form items
    Iterator iter = items.iterator();
    while (iter.hasNext()) {
        FileItem item = (FileItem) iter.next();
    
        if (item.isFormField()) {
           // ** here you get the non-file parameters **
        } else {
            processUploadedFile(item);
        }
    }
    

    【讨论】:

    • 没有办法使用 jdk 获取文件名吗?以上方法是使用apache commons
    • 不,当使用 multipart 时,浏览器将所有内容作为 multipart 发送:文件(数据 + 文件名),参数,...除非您编写自己的 RFC 1867 实现,否则您必须使用一些库来提取每个部分。 Java SE 不包括一个。你不是已经在使用 Commons FileUpload 了吗?
    • 我正在使用。但我希望使用 jsk 来执行此操作。你确定没有办法吗?
    • 不确定你的意思。如果您使用的是符合 JEE6 的服务器,我添加了另一个答案。
    【解决方案3】:

    您得到null,因为当表单是“multipart/form-data”的输入类型并且您的输入类型是“文件”时,它不会进入 HttpServletRequest requestParameterMap()。

    您必须像这样使用 Java EE 6 中的另一个选项:

    Part filePart = request.getPart("FileTag"); // or "File" - I am not sure 
                                                // that not for id value 
                                                // you should search
    String fileName = filePart.getName();
    

    此外,如果您可以使用 JSF,而不仅仅是 Jave EE Servlet(在 JSF 2.2 中)是 input type="file" 的特殊标记:

    <h:inputFile value="#{myFileUploader.file}"/>
    


    这应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      相关资源
      最近更新 更多