zoukankan      html  css  js  c++  java
  • 文件上传细节处理

      文件上传中,我们会遇到很多问题,例如:

    1、上传文件名的中文乱码和上传数据的中文乱码:

        upload.setHeaderEncoding("UTF-8");  //解决上传文件名的中文乱码
           //表单为文件上传,设置request编码无效,只能手工转换
          1.1 value = new String(value.getBytes("iso8859-1"),"UTF-8");
          1.2 String value = item.getString("UTF-8");

    2.为保证服务器安全,上传文件应该放在外界无法直接访问的目录

    3、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名

    4、为防止一个目录下面出现太多文件,要使用hash算法打散存储

    5.要限制上传文件的最大值,可以通过:
        ServletFileUpload.setFileSizeMax(1024)
        方法实现,并通过捕获:
        FileUploadBase.FileSizeLimitExceededException异常以给用户友好提示

    6.想确保临时文件被删除,一定要在处理完上传文件后,调用item.delete方法

    7.要限止上传文件的类型:在收到上传文件名时,判断后缀名是否合法

    8、监听文件上传进度:
        ServletFileUpload upload = new ServletFileUpload(factory);
                upload.setProgressListener(new ProgressListener(){
                    public void update(long pBytesRead, long pContentLength, int arg2) {
                        System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);
                    }
                });

    9. 在web页面中动态添加文件上传输入项
        function addinput(){
                var div = document.getElementById("file");
                
                var input = document.createElement("input");
                input.type="file";
                input.name="filename";
                
                var del = document.createElement("input");
                del.type="button";
                del.value="删除";
                del.onclick = function d(){
                    this.parentNode.parentNode.removeChild(this.parentNode);
                }
                
                
                var innerdiv = document.createElement("div");
                
                
                innerdiv.appendChild(input);
                innerdiv.appendChild(del);
                
                div.appendChild(innerdiv);
            }

     上传upload.jsp 如下

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>My JSP 'upload.jsp' starting page</title>
      </head>
      
      <body>
        
        <form action="${pageContext.request.contextPath }/servlet/UploadServlet1" 
                enctype
    ="multipart/form-data" method="post"> 上传用户:<input type="text" name="username"><br/> 上传文件1:<input type="file" name="file1"><br/> 上传文件2:<input type="file" name="file2"><br/> <input type="submit" value="提交"> </form> </body> </html>

    上传UploadServlet1 如下:

    public class UploadServlet1 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            //request.getParameter("username");  //****错误
            request.setCharacterEncoding("UTF-8");  //表单为文件上传,设置request编码无效
            
            //得到上传文件的保存目录
            String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
            
            try{
                DiskFileItemFactory factory = new DiskFileItemFactory();
           //当上传数据大于DiskFileItemFactory 工厂缓存大小,新建一个临时文件夹来保存到临时文件,再拷贝到文件中 factory.setRepository(
    new File(this.getServletContext().getRealPath("/WEB-INF/temp"))); ServletFileUpload upload = new ServletFileUpload(factory); /*upload.setProgressListener(new ProgressListener(){ public void update(long pBytesRead, long pContentLength, int arg2) { System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead); } });*/ upload.setHeaderEncoding("UTF-8"); //解决上传文件名的中文乱码 if(!upload.isMultipartContent(request)){ //按照传统方式获取数据 return; } /*upload.setFileSizeMax(1024); upload.setSizeMax(1024*10);*/ List<FileItem> list = upload.parseRequest(request); for(FileItem item : list){ if(item.isFormField()){ //fileitem中封装的是普通输入项的数据 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{ //fileitem中封装的是上传文件 String filename = item.getName(); //不同的浏览器提交的文件是不一样 c:a1.txt 1.txt System.out.println(filename); if(filename==null || filename.trim().equals("")){ continue; } filename = filename.substring(filename.lastIndexOf("\")+1); InputStream in = item.getInputStream(); String saveFilename = makeFileName(filename); //得到文件保存的名称 String realSavePath = makePath(saveFilename, savePath); //得到文件的保存目录 FileOutputStream out = new FileOutputStream(realSavePath + "\" + saveFilename); byte buffer[] = new byte[1024]; int len = 0; while((len=in.read(buffer))>0){ out.write(buffer, 0, len); } in.close(); out.close(); item.delete(); //删除临时文件,位置一定要位于流关闭之后 } } }catch (FileUploadBase.FileSizeLimitExceededException e) { e.printStackTrace(); request.setAttribute("message", "文件超出最大值!!!"); request.getRequestDispatcher("/message.jsp").forward(request, response); return; } catch (Exception e) { e.printStackTrace(); } } public String makeFileName(String filename){ //2.jpg return UUID.randomUUID().toString() + "_" + filename; } //利用Hashcode分散生成多级上传文件目录 public String makePath(String filename,String savePath){ int hashcode = filename.hashCode(); int dir1 = hashcode&0xf; //0--15 int dir2 = (hashcode&0xf0)>>4; //0-15 String dir = savePath + "\" + dir1 + "\" + dir2; //upload23 upload35 File file = new File(dir); if(!file.exists()){ file.mkdirs();//多级目录要创建目录的.mkdirs()方法 } return dir; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
  • 相关阅读:
    个人作业3——个人总结(Alpha阶段)
    单元测试
    个人作业2——英语学习APP案例分析
    结对作业-基于GUI的四则运算
    个人作业1:小学四则运算——基于控制台
    个人作业3--------个人总结(Alpha版本)
    结对作业 2
    个人作业 2
    结对作业 肖荣森(201421123079) 苏上鑫(201421123081)
    作业1---四则运算
  • 原文地址:https://www.cnblogs.com/lichone2010/p/3283957.html
Copyright © 2011-2022 走看看