一 javaweb总结--文件上传和下载


一  javaweb总结--文件上传和下载

文章插图
2.3、文件上传的细节
【一javaweb总结--文件上传和下载】上述的代码虽然可以成功将文件上传到服务器上面的指定目录当中 , 但是文件上传功能有许多需要注意的小细节问题 , 以下列出的几点需要特别注意的
1、为保证服务器安全 , 上传文件应该放在外界无法直接访问的目录下 , 比如放于WEB-INF目录下 。
2、为防止文件覆盖的现象发生 , 要为上传文件产生一个唯一的文件名 。
3、为防止一个目录下面出现太多文件 , 要使用hash算法打散存储 。
4、要限制上传文件的最大值 。
一  javaweb总结--文件上传和下载

文章插图
5、要限制上传文件的类型 , 在收到上传文件名时 , 判断后缀名是否合法 。
针对上述提出的5点细节问题 , 我们来改进一下 , 改进后的代码如下:
package me.gacl.web.controller;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.List;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadBase;import org.apache.commons.fileupload.ProgressListener;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;/*** @ClassName: UploadHandleServlet* @Description: TODO(这里用一句话描述这个类的作用)* @author: 孤傲苍狼* @date: 2015-1-3 下午11:35:50**/ public class UploadHandleServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//得到上传文件的保存目录 , 将上传的文件存放于WEB-INF目录下 , 不允许外界直接访问 , 保证上传文件的安全String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");//上传时生成的临时文件保存目录String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");File tmpFile = new File(tempPath);if (!tmpFile.exists()) {//创建临时目录tmpFile.mkdir();}//消息提示String message = "";try{//使用Apache文件上传组件处理文件上传步骤://1、创建一个DiskFileItemFactory工厂DiskFileItemFactory factory = new DiskFileItemFactory();//设置工厂的缓冲区的大小 , 当上传的文件大小超过缓冲区的大小时 , 就会生成一个临时文件存放到指定的临时目录当中 。factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB , 如果不指定 , 那么缓冲区的大小默认是10KB//设置上传时生成的临时文件的保存目录factory.setRepository(tmpFile);//2、创建一个文件上传解析器ServletFileUpload upload = new ServletFileUpload(factory);//监听文件上传进度upload.setProgressListener(new ProgressListener(){public void update(long pBytesRead, long pContentLength, int arg2) {System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);/*** 文件大小为:14608,当前已处理:4096文件大小为:14608,当前已处理:7367文件大小为:14608,当前已处理:11419文件大小为:14608,当前已处理:14608*/}});//解决上传文件名的中文乱码upload.setHeaderEncoding("UTF-8"); //3、判断提交上来的数据是否是上传表单的数据if(!ServletFileUpload.isMultipartContent(request)){//按照传统方式获取数据return;}//设置上传单个文件的大小的最大值 , 目前是设置为1024*1024字节 , 也就是1MBupload.setFileSizeMax(1024*1024);//设置上传文件总量的最大值 , 最大值=同时上传的多个文件的大小的最大值的和 , 目前设置为10MBupload.setSizeMax(1024*1024*10);//4、使用ServletFileUpload解析器解析上传数据 , 解析结果返回的是一个List