1.简介
在本快速教程中,我们将看到如何从Servlet上传文件。
为此,我们将首先看到具有原生@MultipartConfig批注提供的文件上传功能的普通Jakarta EE解决方案。
然后,我们将遍历Apache Commons FileUpload 库,以获取Servlet API的早期版本。
2.使用Jakarta EE @MultipartConfig
Jakarta EE可以开箱即用地支持分段上传。
因此,当通过文件上传支持丰富Jakarta EE应用程序时,这可能是默认的选择。
首先,让我们向HTML文件中添加一个表单:
<form method="post" action="multiPartServlet" enctype="multipart/form-data">
Choose a file: <input type="file" name="multiPartServlet" />
<input type="submit" value="Upload" />
</form>
应当使用enctype =” multipart / form-data”属性定义表单,以表示分段上传。
接下来,我们将使用@MultipartConfig批注使用正确的信息 批注HttpServlet:
@MultipartConfig(fileSizeThreshold = 1024 * 1024,
maxFileSize = 1024 * 1024 * 5,
maxRequestSize = 1024 * 1024 * 5 * 5)
public class MultipartServlet extends HttpServlet {
//...
}
然后,确保设置了默认的服务器上传文件夹:
String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) uploadDir.mkdir();
最后,我们可以使用getParts()方法轻松地从请求中检索入站文件,并将其保存到磁盘中:
for (Part part : request.getParts()) {
fileName = getFileName(part);
part.write(uploadPath + File.separator + fileName);
}
请注意,在此示例中,我们使用了辅助方法getFileName():
private String getFileName(Part part) {
for (String content : part.getHeader("content-disposition").split(";")) {
if (content.trim().startsWith("filename"))
return content.substring(content.indexOf("=") + 2, content.length() - 1);
}
return Constants.DEFAULT_FILENAME;
}
对于Servlet 3.1。项目,我们也可以使用Part.getSubmittedFileName()方法:
fileName = part.getSubmittedFileName();
3.使用Apache Commons FileUpload
如果我们不在Servlet 3.0项目上,则可以直接使用Apache Commons FileUpload库。
3.1。设定
我们将要使用以下pom.xml依赖关系来使示例运行:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
可以在Maven的中央存储库中快速搜索找到最新版本:commons-fileupload和commons-io。
3.2。上载Servlet
合并Apache的FileUpload库的三个主要部分如下:
- .jsp页面中的上载表单。
- 配置您的DiskFileItemFactory和ServletFileUpload对象。
- 处理分段文件上传的实际内容。
上传表单与上一节中的表单相同。
让我们继续创建我们的Jakarta EE servlet。
在我们的请求处理方法中,我们可以对传入的HttpRequest进行包装,以检查它是否是分段上传。
我们还将在DiskFileItemFactory上指定哪些资源可临时分配给文件上传(正在处理) 。
最后,我们将创建一个ServletFileUpload对象,该对象代表实际的文件本身。它将为最终持久性服务器端公开分段上传的内容:
if (ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(MEMORY_THRESHOLD);
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(MAX_FILE_SIZE);
upload.setSizeMax(MAX_REQUEST_SIZE);
String uploadPath = getServletContext().getRealPath("")
+ File.separator + UPLOAD_DIRECTORY;
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
//...
}
然后,我们可以提取这些内容并将其写入磁盘:
if (ServletFileUpload.isMultipartContent(request)) {
//...
List<FileItem> formItems = upload.parseRequest(request);
if (formItems != null && formItems.size() > 0) {
for (FileItem item : formItems) {
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = uploadPath + File.separator + fileName;
File storeFile = new File(filePath);
item.write(storeFile);
request.setAttribute("message", "File "
+ fileName + " has uploaded successfully!");
}
}
}
}
4.运行示例
将项目编译成.war之后,可以将其放入本地Tomcat实例中并启动它。
从那里,我们可以调出主上传视图,并在其中显示一个表单:
成功上传文件后,我们将看到以下消息:
最后,我们可以检查servlet中指定的位置:
5.结论
而已!我们已经学习了如何使用Jakarta EE和Apache的Common FileUpload库提供多部分文件上传!
与往常一样,可以在GitHub上找到代码段。