Servlet 在上传文件后收到空值

问题描述 投票:0回答:1

我有一个包含文件上传功能的 Java Web 应用程序。 HTML 表单

fileUpload.html
允许用户选择文件并将其上传到服务器。表单操作设置为 servlet
ServletFileUpload.java
来处理上传的文件。

这是上面提到的代码:

<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Datei Upload</title>
  </head>
  <body>
    <h1>Dateien hochladen</h1>
    <form action="../fileUpload" method="POST" enctype="multipart/form-data">
      <label for="name">Anzeigename:</label>
      <input type="text" name="name" id="name" required /><br />

      <label for="expirationDate">Ablaufdatum:</label>
      <input
        type="date"
        name="expirationDate"
        id="expirationDate"
        required
      /><br />

      <label for="category">Kategorie:</label>
      <select name="category" id="category" required>
        <option value="" disabled>Wählen Sie eine Kategorie aus</option>
        <option value="aushang1">Aushang 1</option>
        <option value="aushang2">Aushang 2</option>
        <option value="vorschriften">Sicherheitsvorschriften</option>
        <option value="notfaelle">Notfälle</option>
        <option value="organisation">Organisation</option>
        <option value="anlagenleistung">Anlagenleistung</option>
        <option value="abfuellplan">Abfüllplan</option>
        <option value="schichtplan">Schichtplan</option>
        <option value="jahresplanung">Jahresplanung</option>
      </select>
      <br />

      <label for="pdfFile">Wählen Sie eine PDF aus:</label>
      <input type="file" name="pdfFile"  id="pdfFile" accept=".pdf"required><br><br>
      <input type="submit" value="PDF hochladen">
    </form>
  </body>
</html>
@WebServlet("/fileUpload")
public class ServletFileUpload extends HttpServlet {
    private static final Logger logger = LogManager.getLogger(ServletFileUpload.class);

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        logger.debug("Name: {}, Expiration Date: {}, Category: {}",
                request.getParameter("name"),
                request.getParameter("expirationDate"),
                request.getParameter("category"));
    }

我面临的问题是

FileUpload.java
servlet 似乎没有从 HTML 表单接收任何数据。当我提交表单时,记录的内容如下:

15:38:19.860 [http-nio-8081-exec-51] 调试 de.http.ServletFileUpload - 名称:null,过期日期:null,类别:null

提交表单时,我可以在开发者工具中看到表单中的值应该是正确的。

我使用的是 Tomcat 10.1,但使用 Tomcat 9 时得到了相同的结果。 在catalina.log中我找不到与此问题相关的任何内容。

更改 HTML 中的操作引用或 Java 中的

@WebServlet
时,我仍然遇到同样的问题。

希望有人知道这里出了什么问题。

jsp tomcat servlets file-upload multipartform-data
1个回答
0
投票

这样你将无法从请求中获取参数。

multipart/form-data
内容类型使得有必要分部分解析请求正文。也就是说,如果您尝试使用
ServletRequest.getParameter()
获取参数:

将查询参数的值返回为

String
null
如果 参数不存在。请求参数-附加信息, 随请求一起发送。对于 HTTP servlet,参数包含在 查询行或表单数据所在的请求正文中。

然后你会得到

null
,因为请求正文具有不同的格式,如果请求正文具有
application/x-www-form-urlencoded
格式,则上述方法有效。


有关

POST
方法的更多详细信息

HTTP

POST
方法将数据发送到服务器。请求正文类型 由
Content-Type
标题指示。

PUT
POST
之间的区别在于
PUT
是 幂等:连续调用一次或多次具有相同的效果 效应(这不是副作用),其中顺序 相同的
POST
可能会产生额外的效果,例如 多次传输相同的数据。

POST
请求通常通过 HTML 表单发送并导致 服务器上的更改。在这种情况下,内容类型通过以下方式选择 将适当的字符串放置在元素的
enctype
属性中
<form>
formenctype
元素的
<input>
属性或
<button>

  • application/x-www-form-urlencoded
    :键和值被编码 在由
    &
    分隔的键元组中,键和键之间有
    =
    意义。键和值中均包含非字母数字字符 编码为百分比:这就是该类型不适合的原因 用于二进制数据(改为使用
    multipart/form-data
    );
  • multipart/form-data
  • text/plain
    .

为了能够从请求中获取参数和部分文件,您可以使用

@MultipartConfig
注释:

可以放置在

Servlet
类上的注释,指示 servlet 实例期望请求与类型匹配 MIME 与
multipart/form-data
.

标有

MultipartConfig
的 Servlet 可以检索 给定
Part
请求的
multipart/form-data
组件,调用
getPart()
getParts()


您还可以在

教程
中阅读有关@MultipartConfig注释的信息。

您还可以在其中找到使用此注释的

fileupload
示例。

© www.soinside.com 2019 - 2024. All rights reserved.