假如说用户上传了一个a.jsp文件,然后用户在通过浏览器去访问这个a.jsp文件,那么就会执行a.jsp中的内容,如果在a.jsp中有如下语句:Runtime.getRuntime().exec(“shutdown –s –t 1”);,那么你就会…
通常我们会在WEB-INF目录下创建一个uploads目录来存放上传的文件,而在Servlet中找到这个目录需要使用ServletContext的getRealPath(String)方法,例如在我的upload1项目中有如下语句:
ServletContext servletContext = this.getServletContext();
String savepath = servletContext.getRealPath(“/WEB-INF/uploads”);
其中savepath为:F:\tomcat6_1\webapps\upload1\WEB-INF\uploads。
2 文件名称(完整路径、文件名称)上传文件名称可能是完整路径:
IE6获取的上传文件名称是完整路径,而其他浏览器获取的上传文件名称只是文件名称而已。浏览器差异的问题我们还是需要处理一下的。
String name = file1FileItem.getName();
response.getWriter().print(name);
使用不同浏览器测试,其中IE6就会返回上传文件的完整路径,不知道IE6在搞什么,这给我们带来了很大的麻烦,就是需要处理这一问题。
处理这一问题也很简单,无论是否为完整路径,我们都去截取最后一个“\\”后面的内容就可以了。
String name = file1FileItem.getName();
int lastIndex = name.lastIndexOf("\\");//获取最后一个“\”的位置
if(lastIndex != -1) {//注意,如果不是完整路径,那么就不会有“\”的存在。
name = name.substring(lastIndex + 1);//获取文件名称
}
response.getWriter().print(name);
3 中文乱码问题
上传文件名称中包含中文:
当上传的谁的名称中包含中文时,需要设置编码,commons-fileupload组件为我们提供了两种设置编码的方式:
l request.setCharacterEncoding(String):这种方式是我们最为熟悉的方式了;
l fileUpload.setHeaderEncdoing(String):这种方式的优先级高与前一种。
上传文件的文件内容包含中文:
通常我们不需关心上传文件的内容,因为我们会把上传文件保存到硬盘上!也就是说,文件原来是什么样子,到服务器这边还是什么样子!
但是如果你有这样的需求,非要在控制台显示上传的文件内容,那么你可以使用fileItem.getString(“utf-8”)来处理编码。
文本文件内容和普通表单项内容使用FileItem类的getString(“utf-8”)来处理编码。
4 上传文件同名问题(文件重命名)通常我们会把用户上传的文件保存到uploads目录下,但如果用户上传了同名文件呢?这会出现覆盖的现象。处理这一问题的手段是使用UUID生成唯一名称,然后再使用“_”连接文件上传的原始名称。
例如用户上传的文件是“我的一寸照片.jpg”,在通过处理后,文件名称为:“891b3881395f4175b969256a3f7b6e10_我的一寸照片.jpg”,这种手段不会使文件丢失扩展名,并且因为UUID的唯一性,上传的文件同名,但在服务器端是不会出现同名问题的。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
DiskFileItemFactory dfif = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(dfif);
try {
List<FileItem> list = fileUpload.parseRequest(request);
//获取第二个表单项,因为第一个表单项是username,第二个才是file表单项
FileItem fileItem = list.get(1);
String name = fileItem.getName();//获取文件名称
// 如果客户端使用的是IE6,那么需要从完整路径中获取文件名称
int lastIndex = name.lastIndexOf("\\");
if(lastIndex != -1) {
name = name.substring(lastIndex + 1);
}
// 获取上传文件的保存目录
String savepath = this.getServletContext().getRealPath("/WEB-INF/uploads");
String uuid = CommonUtils.uuid();//生成uuid
String filename = uuid + "_" + name;//新的文件名称为uuid + 下划线 + 原始名称
//创建file对象,下面会把上传文件保存到这个file指定的路径
//savepath,即上传文件的保存目录
//filename,文件名称
File file = new File(savepath, filename);
// 保存文件
fileItem.write(file);
} catch (Exception e) {
throw new ServletException(e);
}
}
5 一个目录不能存放过多的文件(存放目录打散)