Servlet 文件上传
Servlet 文件上传
Servlet 文件上传指的是在 web 应用中,由用户上传自己的文件(如图片、文档等),通过 Servlet 技术将上传的文件保存到服务器的指定目录中。Servlet 文件上传主要使用了 Apache 公司的 Commons FileUpload 框架来实现。
实现步骤
-
在表单中添加 enctype=“multipart/form-data” 属性,声明表单数据提交方式为二进制。
<form method="post" enctype="multipart/form-data" action="uploadServlet"> <input type="file" name="file"/> <input type="submit" value="上传"> </form>
-
在 Servlet 中获取上传文件的 ServletInputStream(二进制流数据)并解析。
String savePath = "D:/upload/"; // 上传文件的保存路径 File file = null; String message = ""; try { // 使用 Apache Commons FileUpload 解析表单数据 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8"); // 设置上传文件编码格式 if(!ServletFileUpload.isMultipartContent(request)){ // 判断是否上传了文件 return; } List<FileItem> list = upload.parseRequest(request); for(FileItem item : list){ if(item.isFormField()){ // 判断是否是普通表单项 String fieldName = item.getFieldName(); // 表单项名称 String value = item.getString("UTF-8"); // 表单项值 }else{ // 如果是上传文件项,则需保存文件 String fileName = item.getName(); // 获取文件名 fileName = fileName.substring(fileName.lastIndexOf("\\") + 1); String fileType = fileName.substring(fileName.lastIndexOf(".")); // 通过 UUID 来生成唯一的文件名 String saveFileName = UUID.randomUUID().toString().replace("-", "") + fileType; file = new File(savePath + saveFileName); item.write(file); } } message = "上传成功!"; } catch (Exception e) { message = "上传失败!"; e.printStackTrace(); }
-
将上传文件保存到指定目录,可以使用 IO 流来实现。
文件上传注意事项
-
在表单中添加 enctype=“multipart/form-data” 属性,声明表单数据提交方式为二进制。
-
如果是上传文件项,则需保存文件,保存文件时可以通过 UUID 来生成唯一的文件名。
-
文件的保存路径最好设置在 web 应用以外的目录,防止上传文件导致 web 应用所在的目录被污染。
-
Commons FileUpload 框架需要在项目中引入 commons-fileupload jar 包,并在 Servlet 中进行相应的 import 操作。
结语
Servlet 文件上传是一项比较复杂的技术,但是实现起来也不难。通过学习和练习,我们可以掌握 Servlet 文件上传的技术,为我们今后开发 web 应用提供更多的功能拓展。