文件上传下载
一、文件上传
- 文件上传即将本地文件上传到远程服务器
- 文件上传实际上是以流的形式上传到远程服务器
- 文件上传需要满足的条件:
- 文件上传form表单的提交方式必须为post
- 文件上传的input表单项中的type属性值必须为file
- 文件上传form表单中的enctype的属性值必须为:multipart/form-data
- Enctype的值为application/x-www-form-urlencoded,表单提交的时候对表单中的数据进行url编码,编码后的数据为,属性=属性值&属性2=属性值2
- Enctype的值为multipart/form-data的话,表单提交的时候,表单中的表单项是以一个多部件的形式提交到后台服务器,每一个表单项就是一个多部件,每个多部件之间使用类似于“-----------------------------7e3354253f0706”这样的分隔符隔开;
- FileUpload
- 使用filetUpload工具进行文件上传下载处理
- 使用的时候需要导入jar包
-
- 文件上传用到的核心类和接口
- DiskFileItemFactory :解析器工厂
- ServletFileUpload :得到解析器
- FileItem :通过ServletFileUpload 解析器解析请求,得到FileItem 对象,每一个表单项对应了一个FileItem
- 七个核心方法:
fileItem.isFormField():判断该表单项是否是一个普通表单项,普通表单项即type不是file的表单项
* fileItem.getString(编码格式):获取普通表单项中的文本,还可以指定文本的编码格式
* fileItem.getFieldName():获取表单中的name属性值
* fileItem.getContentType():获取文件的类型
* fileItem.getSize():获取文件大小
* fileItem.getName():获取文件的名称
* fileItem.write(new File()):把为文件上传到远程服务器
- 限制文件上传的大小
ServletFileUpload sfu=new ServletFileUpload(dff);
//限制上传单个文件不能大于600kb
//如果单个文件大于600kb了会触发FileSizeLimitExceededException异常
sfu.setFileSizeMax(1024*600);
//限制多个文件上传大小不能大于1024kb
//如果多个个文件大于1024kb了会触发SizeLimitExceededException异常
sfu.setSizeMax(1024*1024);
- 文件上传示例:
<form action="doUpload" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"><br>
头像:<input type="file" name="photo" accept="image/*"><br/>
<!-- 头像1:<input type="file" name="photo1" accept="image/*"><br/> -->
<input type="submit">
</form>
//得到解析器工厂
DiskFileItemFactory dff=new DiskFileItemFactory();
//得到解析器,进行解析请求
ServletFileUpload sfu=new ServletFileUpload(dff);
//限制上传单个文件不能大于600kb
sfu.setFileSizeMax(1024*600);
//限制多个文件上传大小不能大于1024kb
sfu.setSizeMax(1024*1024);
//通过解析器解析请求,得到FileItem,每一个FileItem对应了一个表单项
try {
List<FileItem> fileItems = sfu.parseRequest(request);
/*解析每一个表单项
* 7个核心方法:
* fileItem.isFormField():判断该表单项是否是一个普通表单项,普通表单项即type不是 file的表单项
* fileItem.getString(编码格式):获取普通表单项中的文本,还可以指定文本的编码格式
* fileItem.getFieldName():获取表单中的name属性值
* fileItem.getContentType():获取文件的类型
* fileItem.getSize():获取文件大小
* fileItem.getName():获取文件的名称
* fileItem.write(new File()):把为文件上传到远程服务器
*/
for (FileItem fileItem : fileItems) {
if(fileItem.isFormField()) {
//获取表单中的文本
String string = fileItem.getString("utf-8");
//获取表单中的name属性值
String fieldName = fileItem.getFieldName();
System.out.println(string+"---"+fieldName);
}else {
//获取文件的类型
String contentType = fileItem.getContentType();
//获取文件大小
long size = fileItem.getSize();
//文件大于0的话再上传
if(size>0) {
//获取文件的名称
String fileName = fileItem.getName();
//把文件上传到tomcat服务器
//"/"代表项目路径(http://localhost:8080/day20_uploadDemo)
String realPath = getServletContext().getRealPath("/upload");
File file=new File(realPath);
//判断路径是否存在
if(!file.exists()) {
//不存在创建该目录
file.mkdirs();
}
//使用ie浏览器的话,获取的文件名称会携带盘符,所有要去掉盘符
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
//为了保证图片名称相同导致服务覆盖名称相同的图片的问题,我们需要 修改原有图片的名称
fileName=UUID.randomUUID()+"_"+fileName;
//把文件上传到realPath目录下文件名称为fileName
fileItem.write(new File("G:/offcn/img/"+fileName));
request.getSession().setAttribute("fileName", fileName);
response.sendRedirect(request.getContextPath()+"/index.jsp");
}else {
request.getSession().setAttribute("msg","文件大小不能小于0");
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
}
}
}catch (FileSizeLimitExceededException e) {
request.getSession().setAttribute("msg","文件大小不能大于600kb");
response.sendRedirect(request.getContextPath()+"/index.jsp");
}catch (SizeLimitExceededException e) {
request.getSession().setAttribute("msg","多个文件大小不能大于1024kb");
response.sendRedirect(request.getContextPath()+"/index.jsp");
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
-
- Tomcat挂载本地目录
- 由于每次重启tomcat,就会重新部署项目,一重新部署项目,之前上传的文件就丢失了
- Servlet3.0提供的文件上传
- 文件上传需要满足的条件:
- 文件上传form表单的提交方式必须为post
- 文件上传的input表单项中的type属性值必须为file
- 文件上传form表单中的enctype的属性值必须为:multipart/form-data
- 处理文件上传的servlet需要加入@MultipartConfig注解,对文件上传的支持
- Part part=request.getPart(“name属性值”);得到文件上传表单项,每个Part对象对应了一个文件上传表单项;
- 使用示例:
@WebServlet("/FileUploadServelt02")
@MultipartConfig
public class FileUploadServelt02 extends HttpServlet {
private static final long serialVersionUID = 1L;
public FileUploadServelt02() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//得到表单中的普通表单项中的数据
String username = request.getParameter("username");
//得到文件上传表单项
Part part = request.getPart("photo");
if(part.getSize()>0&&part.getSize()<1048576) {
//String name = part.getName();//获取文件上传表单项的name属性值
//System.out.println(username+"=="+part.getName()+"==="+part.getSize());
//得到文件的名称
String header = part.getHeader("Content-Disposition");
//解析请求头得到文件名
String fileName=header.substring(header.lastIndexOf("filename")+10,header.length()-1);
//去除使用ie浏览器的时候的盘符
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
//修改文件名称
fileName=UUID.randomUUID()+"_"+fileName;
//文件上传
part.write("G:\\offcn\\img\\"+fileName);
request.getSession().setAttribute("fileName", fileName);
response.sendRedirect(request.getContextPath()+"/servlet3.0Upload.jsp");
}else {
request.getSession().setAttribute("msg","文件不能小于0并且文件不能大于1M");
response.sendRedirect(request.getContextPath()+"/servlet3.0Upload.jsp");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}