zoukankan      html  css  js  c++  java
  • 关于上传和下载的笔记

    上传:  

    要求:1.表单的method必须是post  

        2.表达增加enctype="multipart/form-data"  

        3.input标签的type属性的值是file

     Servlet具体方法:

        1.创建工厂:DiskFileItemFactory=new DiskFileItemFactory();

     2.创建解析器:ServletFileUpload sfu=new ServletFileFactory(factory);  

    3.使用List<FileItem>从解析器得到文件:List<FileItem> list=sfu.ParseRequest(request);  

    4.可以根据FileItem的getName()得到文件的名称:FileItem fl=list.get(index);  String filename=fl.getName();  

    5.保存文件:File file=new File("文件路径");  

    6.fl.write(file);

     =================================================

     基本步骤大致如此  

    =================================================

     但是----------------》》》》》》》

     我们需要考虑一些细节:

     1.上传文件的编码问题   有两种方式可以解决:  

       1):request.setCharacterEncoding("utf-8");    

        2):通过解析器的sfu.setHeaderEncoding("utf-8")方法解决   注意:当同时采取两种方法时,fu.setHeaderEncoding("utf-8")具有优先级,会覆盖                request.setCharac terEncoding("utf-8"); 

     

     2.由于用户上传的文件带有路径,如何截取文件的名字呢?   通常在用户上传文件时会带有路径,比如:F:/demp/file/movies/AAA.txt,那么我们就只需要AAA.txt而不需要之前的信息,解决方法如下:

      比方说我们保存F:/demp/file/movies/AAA.txt的变量为filename,那么    int index=filename.lastIndexof("\");[此刻请注意是"\",切记!]    if(index!=-1){     filename=filename.substring(index+1);    }  

    3.保存文件的时候保存的位置   首先我们不可能直接把文件保存在自己的磁盘上吧!不要问我为什么。肯定是要放在服务器上的,那么我们应该保存在哪里呢?最好是在WEB-INF目录下新建一个文件夹,比如说是files,切不可保存在webroot下,理由:不想说,但是我期待你这样做!!   如何保存呢?可以这样:   String root=this.getServletContext().getRealPath("/WEB-INF/files/");

     4.当用户上传的文件过大时,如何处理难点直接保存在服务器?   在本次磁盘上建立一个临时的文件夹,用于临时保存用户的文件,当文件上传文件成功后服务器会自动将其保存到files里面。

      实现方法:DiskFileItemFactory factory=new DiskFileItemFacoty(1024*10,new File("F:/temp"));

      注意:1024*10表示上传的文件超过了10kb的时候就会放到临时文件夹,否则不会,可以随便改的,10KB也是默认的   new File("F:/temp")就不用说了吧,,,指定临时文件夹  4.如何对用户上传的文件大小限制   可以用解析器sfu的sf.setFileSizeMax(fileSizeMax)和sf.setSizeMax(fileSizeMax)方法解决,前者是单个文件限制,后者是表单文件大小限制  

    5.保存文件的时候如何处理同名问题   一般是在文件名的前面加上一个前缀,前缀肯定是唯一的嘛。具体实现自己看着办啊

     6.文件的储存方式(不能在一个文件夹储存过多文件,否则会卡的,如果不信可以把你电脑的文件全部放在一个文件夹试试,你就慢慢打开吧)   我之前是在WEB-INF下建立了一个files文件夹,但是不能所有的文件都放在这里吧,  

     我们通常有两种方法处理此类问题:

      1.时间打散:      

     2.哈希打散    

      由于本次项目我使用的是哈希打散,所以我详细的介绍一下这个方法:

       1).int code=filename.hashcode();//根据文件名称得到一个int类型的数字   String hex=Integr.setHexString(code);//根据该数字得到一个16进制的字符串

       2).根据创建的files文件夹和hex随机生成文件夹,比如是两个级别的文件夹:    File dirFile=new File(root,hex.charAt(0)+"/"+hex.charAt(1));(root是第三步写的,没注意可以看)

       3).然后执行dirFile.mkdirs()方法,创建多个文件夹【注意是mkdirs()不是mkdir(),区别不解释】

       4).File deskFile=new File(dirfile, 有前缀的文件名);

       5).最后,保存:file.write(deskFile);//保存

    下载:

     记住一句话:两个头一个流

     两个头:

     Content-Type:

           /*获取文件的MIME类型*/   

        String contentType=this.getServletContext().getMimeType(filename);   

     Content-Dispostion:   String contentDisposition="attachmentDisposition;filename="+filename;

     response.setHeader("Content-Type", contentType);  

    response.setHeader("Content-Disposition", contentDisposition);  

    一个流:文件流   FileInputStream input=new FileInputStream(file);

      步骤就不说了,最后记得关闭流就可以了!!!

  • 相关阅读:
    DataGird导出EXCEL的几个方法
    csv文件与DataTable互相导入处理
    LeetCode 345
    LeetCode 168
    LeetCode 344
    LeetCode 342
    LeetCode 343
    LeetCode 326
    LeetCode 338
    LeetCode 319
  • 原文地址:https://www.cnblogs.com/Mindreader/p/5221633.html
Copyright © 2011-2022 走看看