JavaWeb基础知识总结. (64)

假如说用户上传了一个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 一个目录不能存放过多的文件(存放目录打散)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzfdw.html