教你五分钟学会文件上传和下载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38095094/article/details/75965679

文件上传和下载

主要使用两个jar包可以实现多种不同类型文件的上传
* commons-io-1.4.jar
* commons-fileupload-1.2.1.jar

文件上传的主要思路是:

  • 首先在服务器端创建一个工厂作为空间
  • 创建解析器,将工厂放入解析器中
  • 将得到的请求放入解析器中解析
  • 遍历得到的解析,判断是不是传输文件
  • 若为传输文件,获得文件名,设置保存的路径,用IO流将它输出保存到服务器端
    //第一件事就是要将两个jar包引入到工程的web-lib目录下  

    //1.创建工厂
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //2.根据工厂配置解析器
    ServletFiledUpload fileUpload = new ServletFileUpload(factory);
    //3.根据解析器获取请求的FileItem集合
    List<FileItem> list = fileUpload.parstRequest(request);
    //4.遍历FileItem集合
    for(FileItem item:list){
        //5.判断请求是不是上传文件
        if(item.isFormField){
            //成立则证明不是上传文件

            //获得名称,例如是向文本框输入内容传输,则得到文本框的内容
            String fileName = item.getFieldName();
            String value = item.getString();

        }else{
            //获得文件名
            String fileName1 = item.getName();
            //在不同浏览器中,传输过来的文件名称不同,有的是传输绝对路径,有的是传输相对路径  
            if(fileName1.contains("\\"){
                //将绝对路径变为相对路径
                fileName1 = fileName1.subString(fileName.lastIndexOf("\\")+1);
            }
            //设置你要存储的路径
            //假如保存在该项目的WEB-INF目录下
            String realPath = servletContext().getRealPath()+"/WEB-INF"+fileNames;
            //获得输入流
            BufferedInputStream inputStream = new BufferedInputStream(item.getInputStream());
            //获得输出流
            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(realPath));

             int temp = 0;
            while ((temp = inputStream.read())!=-1){
            System.out.println("来过这里");
            outputStream.write(temp);
                  }

                  输出完毕后记得关闭缓冲流
            outputStream.flush();
            outputStream.close();
             inputStream.close();
            }
        }
    }

注意:当文件过大时,可以先设置一个缓冲区,将传输的文件先放到一个暂时目录中,由系统将它复制过去,最后将临时文件删除即可

    //在创建工厂之后设置一个缓冲区
    factory.setSizeThreshold(1024*1024*8);  //设置当传输文件超过8M的时候会将文件暂时放到缓冲区  
    String realPath = "设置你临时文件存放的路径";
    File repository = new File(realPath);
    factory.setRepository(repository);

    //解决中文乱码问题 ,在解析器中设置  
    fileUpload.setHeaderEncoding("UTF-8");

    //最后文件传输结束时要记得删除临时文件
    item.delete();  //将遍历文件的临时文件删除

### 文件下载
* 一般浏览器具有这样的机制,当你点击一个连接,假如文件类型是比较简易的类型比如txt、jpg类型的,浏览器会直接打开而不是询问你时候下载,如果时docx等类型的文件会询问你是否下载。
* 因此要想文件一直都询问你是否下载,可以设置两个响应头字段,使得文件以附件形式保存
* 两个响应头字段分别是(默认fileName为要下载的文件名):
+ response.setContentType(getServletContent().getMimeType(fileName));
+ response.setHeader(“Content-Disposition”,”attachment;filename”+fileName);

     String fileName = request.getParameter("file");
        //获取文件的绝对路径
        String absolutePath = "你可以被下载的资源所存放的路径"+fileName;
        //必须设置两个响应头
        response.setCharacterEncoding("utf-8");
        response.setContentType(getServletContext().getMimeType(fileName));
        response.setHeader("Content-Disposition", "attachment;filename"+fileName);
        File file = new File(absolutePath);
        BufferedInputStream bif = new BufferedInputStream(new FileInputStream(file));
        //获取浏览器输出流
        BufferedOutputStream bof = new BufferedOutputStream(response.getOutputStream());
        int tmp = 0;
        byte[] bt = new byte[1024];
        while((tmp=bif.read(bt))!=-1){
            bof.write(bt, 0, tmp);
        }
        bof.close();
        bif.close();
     }

下载之后的文件一般会保存C盘User目录的下载文件中

猜你喜欢

转载自blog.csdn.net/qq_38095094/article/details/75965679