上传
客户端将本地的资源通过网络传输给服务端,然后保存到服务端本地。
使用技术:
HTTP网络协议 + IO流
- JSP
- input的type设置为file
- form表单的method设置为post
- form表单的enctype设置为multipart/form-data(二进制数据)
- Servlet
- 接收数据不能调用request.getParameter()获取,必须通过二进制流来获取数据。
public class UploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建DiskFileItemFactory
DiskFileItemFactory factory = new DiskFileItemFactory();
//2.创建文件解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件的上限,以byte为单位,不能超过2M
//1byte*1024 = 1KB * 1024 = 1MB * 1024 = 1GB * 1024 = 1TB
upload.setSizeMax(1024*1024*2);
//3.获取List<FileItem>
try {
List<FileItem> list = upload.parseRequest(req);
for (FileItem fileItem:list){
//4.判断FileIteam的类型,是否为表单域(文本输入)
//如果是表单域,表示该值是一段文本,打印输出
//如果不是表单域,表示该值是一个文件,通过IO完成上传
if(fileItem.isFormField()){
String name = fileItem.getFieldName();
//处理中文乱码
String value = fileItem.getString("UTF-8");
System.out.println(name+":"+value);
}else{
String path = req.getServletContext().getRealPath("file");
OutputStream outputStream = new FileOutputStream(path+"/"+fileItem.getName());
InputStream inputStream = fileItem.getInputStream();
int temp = 0;
while((temp = inputStream.read())!=-1){
outputStream.write(temp);
}
outputStream.close();
inputStream.close();
}
}
} catch (FileUploadException e) {
String message = "上传的文件大小不能超过2M,请重新选择上传";
req.getSession().setAttribute("message",message);
resp.sendRedirect("upload.jsp");
}
}
}