HttpServletRequest 提供了两个方法用于从请求中解析上传的文件:
Part getPart(String name): 用于获取请求中指定name的文件
Coolection< Part > getParts();获取请求中全部的文件
每一个文件用 javax.servlet.http.Part 对象来表示,该接口提供了很多处理文件的方法
@MutipartConfig 可以设置 相应参数限制条件,必须声明,否则会报错,这里涉及到SpringMVC里的配置,先跳过。
package com.bluemsun.controller;
import com.bluemsun.util.JsonUtil;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@MultipartConfig
@WebServlet("/up")
public class FileController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Part part = request.getPart("file");
// 获取上传的文件名扩展名
String disposition = part.getSubmittedFileName();
String suffix = disposition.substring(disposition.lastIndexOf("."));
// 随机的生成uuid,作为文件名的一部分。 加上刚才获取到的后缀作为最终文件名。
String filename = UUID.randomUUID()+suffix;
// 获取文件上传的位置,绝对路径URL
String serverpath = request.getServletContext().getRealPath("upload");
System.out.println(filename);
System.out.println(serverpath);
//不存在文件夹则新建一个
File fileDisk = new File(serverpath);
if (!fileDisk.exists()){
fileDisk.mkdir();
}
// 文件的真正绝对路径 = 文件存储位置 + 文件名
String fileparts = serverpath + "/" + filename;
// 将文件内容写入指定的磁盘位置
part.write(fileparts);
// 准备给前端返回的文件访问的URL
String projectServerPath = request.getScheme()+"://"+request.getServerName()+":"
+request.getServerPort()+request.getContextPath()+"/upload/"+filename;
// request.getSchema()可以返回当前页面使用的协议,http 或是 https;
// request.getServerName()可以返回当前页面所在的服务器的名字;
// request.getServerPort()可以返回当前页面所在的服务器使用的端口,就是8080;
// request.getContextPath()可以返回当前页面所在的应用的名字;
// 拼接起来后就是完整的文件访问路径了!
// 返回给前端文件访问的URL
Map<String,String> map = new HashMap<>();
map.put("address",projectServerPath);
String json = JsonUtil.toJson(map);
response.getWriter().println(json);
}
}
文件上传时的普遍要求。
1、为保证服务器安全,一些上传的文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。
2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。
3、为防止一个目录下面出现太多文件,可以使用hash算法打散存储。
4、要限制上传文件的最大值。
5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。