servlet实现文件上传与下载功能

  /**

  * 需要解决的问题:

  * 1 必须要把文件存放到WEB-INF目录下,避免用户看到

  * 2 文件名相关问题

  * 1 有的浏览器会传递绝对路径到name中,我们只需要进行拆分即可

  * 2文件重名问题,我们可以使用uuid

  * 3文件名乱码问题,我们已经解决了。即request.setCharacterEncoding("utf-8");

  * 3 文件打散问题

  * 1通过首字符打散

  * 2通过时间打散

  * 3通过hash打散

  * 4上传文件大小限制

  * 1单个文件上传大小限制

  * 2总文件上传大小限制

  * 设置这两个参数时,我们必须在没有解析之前执行。

  * 5 缓存大小与临时目录

  *

  *

  *

  **/

  public class FileUploadServlet extends HttpServlet {

  public void doPost(HttpServletRequest request, HttpServletResponse response)

  throws ServletException, IOException {

  request.setCharacterEncoding("utf-8");

  response.setContentType("text/html;charset=utf-8");

  /**

  * 我们使用commmons的小工具来进行编码

  * 设置jsp页面的enctype= “multipart/form-data“;

  * 1 创建FileItem工厂

  * 2创建ServletFileUpload对象

  * 3 解析request得到FileItem

  * 4对FileItem进行操作

  **/

  String path = request.getSession().getServletContext().getRealPath("/WEB-INF");

  //解决缓存大小,要不然你的内存会爆的。

  DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(1024 * 10,new File(path + "/" + "tmp2") );

  ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);

  List l = null;

  try {

  l = fileUpload.parseRequest(request);

  FileItem f2 = l.get(0);

  //解决文件存放在WEN_INF目录下问题

  path = path + "/tmp";

  //解决浏览器传递绝对路径问题

  String name = f2.getName();

  int i = name.lastIndexOf("/");

  if(i != -1) {

  name = name.substring(i);

  }

  //解决文件重名问题

  name = (UUID.randomUUID().toString().replace("-","").trim()) + name;

  //文件打散问题解决方法演示之hash打散

  int has = name.hashCode();

  //转换位16进制位,我们使用前两个值来判断

  String hex = Integer.toHexString(has);

  path = path + "/" + hex.charAt(0) + "/" + hex.charAt(2) ;

  File file = new File(path);

  if(! file.exists()) {

  file.mkdirs();

  }

  f2.write(new File(path + "/" + name));

  request.setAttribute("msg","恭喜你,上传成功了!");

  request.getRequestDispatcher("/index.jsp").forward(request, response);

  } catch (Exception e) {

  request.setAttribute("msg",e.getMessage());

  request.getRequestDispatcher("/index.jsp").forward(request, response);

  }

  }

  }