我有一个包含文件上传功能的 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
时,我仍然遇到同样的问题。
希望有人有一个想法,这里出了什么问题。
这样,您将无法从请求中删除参数。
multipart/form-data
内容类型使得有必要分部分解析请求正文。也就是说,如果您尝试使用 ServletRequest.getParameter()
获取参数:
将查询参数的值返回为
或String
如果 参数不存在。请求参数-附加信息, 随请求一起发送。对于 HTTP servlet,参数包含在 查询行或表单数据所在的请求正文中。null
然后你会得到
null
,因为请求正文具有不同的格式,如果请求正文具有application/x-www-form-urlencoded
格式,则上述方法有效。
POST
方法的更多详细信息:
HTTP
方法将数据发送到服务器。请求正文类型 由POST
标题指示。Content-Type
和PUT
之间的区别在于POST
是 幂等:连续调用一次或多次具有相同的效果 效应(这不是副作用),其中顺序 相同的PUT
可能会产生额外的效果,例如 多次传输相同的数据。POST
请求通常通过 HTML 表单发送并导致 服务器上的更改。在这种情况下,内容类型通过以下方式选择 将适当的字符串放置在元素的POST
属性中enctype
或<form>
元素的formenctype
属性或<input>
:<button>
:键和值被编码 在由application/x-www-form-urlencoded
分隔的键元组中,键和键之间有&
意义。键和值中均包含非字母数字字符 编码为百分比:这就是该类型不适合的原因 用于二进制数据(改为使用=
);multipart/form-data
;multipart/form-data
.text/plain
@MultipartConfig
注释:
可以放置在
类上的注释,指示 servlet 实例期望请求与类型匹配 MIME 与Servlet
.multipart/form-data
标有
的 Servlet 可以检索 给定MultipartConfig
请求的Part
组件,调用multipart/form-data
或getPart()
。getParts()
您还可以在教程4中阅读[MultipartConfig]注释。
您还可以在其中找到使用此注释的
fileupload
示例。