注册
登录
一个完整的文件上传功能包含了前端页面和服务端代码
前端页面:
在做文件上传的时候 会有一个上传文件的页面,首先我们需要一个表单,并且表单的请求方式为post,其次我们的form表单的enctype必须设置为multiparty/form-data 即 enctype="multiparty/form-data" 意思是设置表单类型为文件上传表单,默认情况下form表单的类型是application/x-www-form-urlencoded 不能用在文件上传上边,只能作为普通表单进行数据传输
针对文件上传有多种方式,这里整理两种常用方式
上传文件方式1.
页面上传表单
<form id="form1" action="${pageContext.request.contextPath}/admin/user/save.do"
method="post" enctype="multipart/form-data">
头像:<input type="file" id="imageFile" name="imageFile"/>
</form>
后台处理
@RequestMapping("/save")
public void save(@RequestParam(value = "imageFile",required = false) MultipartFile imageFile, User user,
HttpServletRequest request, HttpServletResponse response)throws Exception{
if(!imageFile.isEmpty()){
// 获取项目访问路径
String filePath=request.getServletContext().getRealPath("/");
// 拼接文件名
// imageFile.getOriginalFilename().split("\\.")[1] 截取原文件的后缀
String imageName= DateUtil.getCurrentDateStr()+"."+imageFile.getOriginalFilename().split("\\.")[1];
// 将头像上传到指定目录
imageFile.transferTo(new File(filePath+"static/userImages/"+imageName));
user.setImageName(imageName);
}
int resultTotal=userService.updateUser(user);
StringBuffer result=new StringBuffer();
if(resultTotal>0){
result.append("<script language='javascript'>alert('修改成功!');</script>");
}else{
result.append("<script language='javascript'>alert('修改失败!');</script>");
}
ResponseUtil.write(response, result);
}
上传文件方式2.
上传表单不变 我们还是使用方式1的表单
上传后台处理代码
后台实现
使用@MultipartConfig注解将一个Servlet标注为支持文件上传的Servlet
标注后Servlet会将multipart/form-data的post请求封装成part对象,
我们通过part对象就可以对上传的文件进行操作了
如果使用的不是Servlet 则无需添加@MultipartConfig注解
package com.et.upload;
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.IOException;
@WebServlet("/uploadServlet")
@MultipartConfig // 标注支持文件上传
public class UploadFile extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求的编码格式 - 防止请求中有中文出现乱码
req.setCharacterEncoding("UTF-8");
// 获取普通表单
String name = req.getParameter("name");
System.out.println("name = "+name);
// 获取Part对象
Part part = req.getPart("myfile");
// 获取上传的文件名 * tomcat7没有提供getSubmittedFileName方法获取文件名 需要替换为下面截取的方式 tomcat8有提供
// String fileName = part.getSubmittedFileName();
String cd = part.getHeader("Content-Disposition");
//获取文件名 截取不同类型的文件需要自行判断
String fileName = cd.substring(cd.lastIndexOf("=")+2, cd.length()-1);
// 获取当前项目路径 即文件上传后需要存放的路径
String path = getServletContext().getRealPath("/");
System.out.println("文件保存地址:"+path+"\\"+fileName);
// 将文件上传到指定的位置
part.write(path+"/"+fileName);
}
}