文件上传要注意的问题:
1、非上传文件的乱码问题,此时通过request设置字符编码无效
2、上传文件的名字含有中文字符,会乱码
3、文件重名会覆盖
4、所有上传的文件要保存在不同的目录下面
5、可以设置文件上传的类型限制
6、可以设置文件上传大小
7、可以设置文件上传总量的大小
后面三个在代码中没有写,5,可以获取文件的后缀名,判断一下就行了,67 api更是有对应的方法,两行代码搞定了
package cn.web.upload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class UploadServlet
*/
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try{
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");//解决上传中文文件名字乱码问题
if(!upload.isMultipartContent(request)){
//不是上传文件表单,按照传统方式获取内容即可
return;
}
Map<String,List<FileItem>> map = upload.parseParameterMap(request);
String savepath = this.getServletContext().getRealPath("/WEB-INF/upload");
int i = 0;
for(Map.Entry<String,List<FileItem>> me : map.entrySet()){
FileItem item = me.getValue().get(i);
if(item.isFormField()){
String name = item.getFieldName();
String value = item.getString("UTF-8");//解决表单数据乱码的问题
// value = new String(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name + " = " + value);
}else{
InputStream in = item.getInputStream();
String name = item.getName(); //得到文件的名字或者路径名+名字
name = name.substring(name.lastIndexOf("\\") + 1);
String fileName = this.makeFileName(name);//解决问价重名,覆盖的问题
String realPath = this.makePath(fileName, savepath);//解决文件都在同一个目录下的问题
File file = new File(realPath + "\\" + fileName);
FileOutputStream out = new FileOutputStream(file);
int len=0;
byte buffer[] = new byte[1024];
while((len=in.read(buffer))!=-1){
out.write(buffer, 0, len);
}
out.close();
in.close();
}
}
}catch (Exception e){
throw new RuntimeException(e);
}
}
//为文件生成一个唯一的名字
public String makeFileName(String name){
return UUID.randomUUID().toString() + "_" + name;
}
//生成目录
public String makePath(String fileName,String path){
int hashCode = fileName.hashCode();
int dir1 = hashCode&0xf;
int dir2 = (hashCode&0xf0)>>4;
String dir = path +"\\"+ dir1 +"\\" + dir2;
File file = new File(dir);
if(!file.exists()){
file.mkdirs();
}
return dir;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>上传页面</title> </head> <body> <form action="${pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="name"/><br> 上传文件1:<input type="file" name="file1"/><br> 上传文件2:<input type="file" name="file2"/><br> <input type="submit" value="提交"/> </form> </body> </html>
注意:上传的文件一定要有enctype="multipart/form-data";这句话