文件上传
- 向服务器上传一个文件时,表单要使用post请求;
- 表单的默认属性enctype=”application/x-www-form-urlencoded”
这个属性的意思是请求体中的内容将会使用URL编码; - 当表单实现上传功能时 上传文件的表单enctype需要设置为 multipart/form-data
- 当表单设置为multipart/form-data时,我们request.getParameter()将失效,我们不能再通过该方法获取请求参数
使用步骤:
1.获取工厂类实例[DiskFileItemFactory]
2.获取解析器类实例[ServletFileUpload]
3.解析request获取FileItem[parseRequest()]
实现代码:
request.setCharacterEncoding("utf8");
DiskFileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload fileupload=new ServletFileUpload(factory);
fileupload.setFileSizeMax(1024*50);
ServletContext servletcontext=request.getServletContext();
String realPath = servletcontext.getRealPath("/upload");
File file=new File(realPath);
System.out.println(realPath);
if(!file.exists()) {
file.mkdir();
}
try {
List<FileItem> parseRequest = fileupload.parseRequest(request);
for(FileItem item:parseRequest){
if(item.isFormField()){
String name=item.getFieldName();
}else{
long size=item.getSize();
if(size==0) {
continue;
}
String contentType = item.getContentType();
String name=item.getName();
//在String字符串中\为转义符
if(name.contains("\\")) {
name=name.substring(name.lastIndexOf("\\")+1);
}
//保持文件名唯一性
String flag=UUID.randomUUID().toString();
flag=flag.replace("-", "");
String fileName=flag+"_"+name;
try {
item.write(new File(realPath+"\\"+fileName));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}catch (FileSizeLimitExceededException e) {
System.out.println("�ļ���С����");
}
catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
文件下载
ServletContext servletContext = request.getServletContext();
// String fileName = URLEncoder.encode("琵琶语_林海.mp3", "utf-8");
String fileName="琵琶语_林海.mp3";
String path=servletContext.getRealPath("/WEB-INF/"+fileName);
//将字符串用gbk进行解码,然后在使用iso8859-1进行编码
fileName = new String(fileName.getBytes("gbk"),"iso8859-1");
File file=new File(path);
//获取下载文件类型
String type = servletContext.getMimeType(path);
response.setContentType(type);
/*Content-Disposition告诉浏览器如何处理文件,
attachment 告诉浏览器这个文件是一个附件的形式发给你的,需要你做下载的操作
filename 告诉浏览器下载文件的名字*/
response.setHeader("Content-Disposition","attachment; filename="+fileName);
//先读后写,再拷贝
InputStream in=new FileInputStream(file);
PrintWriter out=response.getWriter();
IOUtils.copy(in, out);