三、基于注解文件上传
3.1 原理
将客户端的文件以流的形式进行解析发送至服务器端并进行保存的过程称之为文件上传,很多前端框架都定义了这种上传的功能,大致分为几类,form表单形式,ajax形式
在servlet3.0之后可以将数据封装为part对象可以直接获取上传的文件数据,需要将servlet使用***@MultipartConfig***进行标识
3.2 书写
前台代码无需修改
package com.yunhe.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.*;
import java.util.Collection;
import java.util.UUID;
@WebServlet("/upload")
//告诉服务器 这个servlet可以用来直接接收文件
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//可以直接通过name获取请求中的值
String username = request.getParameter("username");
//单个文件时使用
// Part part = request.getPart("imgFile");
//获取提交文件的名字(单个文件)
// String submittedFileName = part.getSubmittedFileName();
//获取前台请求的所有文件(包含普通字段在内)
Collection<Part> parts = request.getParts();
for (Part p : parts) {
//普通字段封装为part对象数据为null
if(p.getSubmittedFileName()!=null){
InputStream inputStream = p.getInputStream();
BufferedInputStream bis=new BufferedInputStream(inputStream);
File file=new File("F://upload", UUID.randomUUID()+p.getSubmittedFileName());
FileOutputStream fos=new FileOutputStream(file);
byte [] b=new byte[2048];
int len=0;
while((len=bis.read(b))!=-1){
fos.write(b,0,len);
}
bis.close();
fos.flush();
fos.close();
}
}
}
}