文件的上传下载

前言:

  • 学习技术是一个苦乐皆有的过程,目标对于学习而言是不可缺少的,一旦没有了目标,就会丧失向前的动力

文件的上传

1.上传文件到磁盘
<body>
   <form action="UploadServlet" method="post" enctype="multipart/form-data">
       用户名:<input type="text" name="username"/><br/>
       密码:<input type="password" name="password"/><br/>
       <input type="file" value="选择文件" name="file"/><br/>
       <input type="submit" value="提交"/>
   </form>
</body>
  • enctype属性
    • multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
    • 需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。
    • application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。
  • 扩展资料
    • 一、关于HTML 标签的 enctype 属性

      • application/x-www-form-urlencoded:在发送前编码所有字符(默认)

      • multipart/form-data: 不对字符编码,或在使用包含文件上传控件的表单时,必须使用该值。

      • text/plain:空格转换为 “+” 加号,但不对特殊字符编码。

    • 二、enctype:规定了form表单在发送到服务器时候编码方式,有如下的三个值。

    • 1、application/x-www-form-urlencoded。默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下。

    • 2、multipart/form-data 。 指定传输数据为二进制类型,比如图片、mp3、文件。

    • 3、text/plain。纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。

//1.创建一个磁盘工厂对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //2.通过工厂对象创建上传对象
        ServletFileUpload fUpload = new ServletFileUpload(factory);
        //3.通过上传对象解析前端发送的复合型表单数据
        List<FileItem> list = null;
        try {
            list = fUpload.parseRequest(request);
            for (FileItem fItem:list) {
                //System.out.println(fItem);
                if(!fItem.isFormField()){
                    //4.获取输入流
                    InputStream is = fItem.getInputStream();
                    //5.创建输出流--getName()获取的是文件名
                    FileOutputStream fos = new FileOutputStream("e:\\File\\" + fItem.getName());
                    byte[] b = new byte[1024];
                    int len;
                    while((len=is.read(b)) != -1){
                        fos.write(b,0,len);
                    }
                    fos.close();
                    is.close();
                }
            }
        } catch (FileUploadException | IOException e) {
            e.printStackTrace();
        }
2.上传文件到服务器
//1.创建一个磁盘工厂对象
       DiskFileItemFactory factory = new DiskFileItemFactory();
       //2.通过工厂对象创建上传对象
       ServletFileUpload fUpload = new ServletFileUpload(factory);
       //3.通过上传对象解析前端发送的复合型表单数据
       List<FileItem> list = null;
       try {
           list = fUpload.parseRequest(request);
           for (FileItem fItem:list) {
               //System.out.println(fItem);
               //判断是否非文本信息
               if(!fItem.isFormField()){
                  //E:\tools\apache-tomcat-7.0.57\webapps\Day41_Upload_Download\Upload
                   //4.通过全局对象获取绝对路径
                   String path = getServletContext().getRealPath("Upload");
                   //判断路径是否存在,不存在则创建
                   File file = new File(path);
                   if(!file.exists()){
                       file.mkdirs();
                   }
                   //输出路径拼接文件名
                   File newFile = new File(file, fItem.getName());
                   IOUtils.copy(fItem.getInputStream(),new FileOutputStream(newFile));

               }
           }
       } catch (FileUploadException | IOException e) {
           e.printStackTrace();
       }
3.解决重名问题
  • 使用UUID来生成唯一ID
//创建一个磁盘工厂
        DiskFileItemFactory dff = new DiskFileItemFactory();
        //通过工厂对象创建一个上传对象
        ServletFileUpload sfu = new ServletFileUpload(dff);
        //通过上传对象解析前端发送的复合型表单数据
        try {
            List<FileItem> list = sfu.parseRequest(request);
            for (FileItem fileItem : list) {
                if (!fileItem.isFormField()) {
                    //创建UUID来生成唯一的ID值
                    UUID uuid = UUID.randomUUID();
                    //获取全局变量
                    String upload = getServletContext().getRealPath("Upload");
                    File file = new File(upload);
                    if (!file.exists()) {
                        file.mkdirs();
                    }
                    File file1 = new File(upload, uuid.toString()+"_"+fileItem.getName());
                    IOUtils.copy(fileItem.getInputStream(), new FileOutputStream(file1));
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
  • 使用时间来生成目录
//创建一个磁盘工厂
        DiskFileItemFactory dff = new DiskFileItemFactory();
        //通过工厂对象创建一个上传对象
        ServletFileUpload sfu = new ServletFileUpload(dff);
        //通过上传对象解析前端发送的复合型表单数据
        try {
            List<FileItem> list = sfu.parseRequest(request);
            for (FileItem fileItem : list) {
                if (!fileItem.isFormField()) {
                    //使用时间来创建唯一ID
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/HH/mm/ss");
                    String time = sdf.format(date);
                    String upload = getServletContext().getRealPath("Upload");
                    //upload--E:\tools\apache-tomcat-7.0.57\webapps\Day41_Upload_Download\Upload
                    //time--2019/2/25/14/56
                    File file = new File(upload, time);
                    if(!file.exists()){
                        file.mkdirs();
                    }
                    File file1 = new File(file, fileItem.getName());
                    IOUtils.copy(fileItem.getInputStream(),new FileOutputStream(file1));
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
  • 使用提示用户重名来解决重名问题–>不推荐使用
if(fileItem.getName().equals("") || fileItem.getName().equals(null)){
                        request.setAttribute("msg","请选择图片");
                        request.getRequestDispatcher("Register.jsp").forward(request,response);
                    }else{
                        String upload = getServletContext().getRealPath("Upload");
                        File file = new File(upload, fileItem.getName());
                        if(file.exists()){
                            request.setAttribute("msg","图片重名请重新命名");
                            request.getRequestDispatcher("Register.jsp").forward(request,response);
                        }else{
                            new File(upload).mkdirs();
                            IOUtils.copy(fileItem.getInputStream(),new FileOutputStream(file));
                        }
                    }
4.存储完整的表单信息并展示图片
//1.创建一个磁盘工厂对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //2.通过工厂对象创建上传对象
        ServletFileUpload fUpload = new ServletFileUpload(factory);
        //3.通过上传对象解析前端发送的复合型表单数据
        List<FileItem> list = null;
        HashMap<String, String> map = new HashMap<>();
        Student student = new Student();
        try {
            //通过上传对象解析请求中的数据,获得集合
            list = fUpload.parseRequest(request);

            for (FileItem fItem:list) {
                //判断是否非文本信息
                if(!fItem.isFormField()){
                    //2.修改上传图片的名字
                    //使用UUID--生成唯一的ID值---wehfiw123%@#$!6fwef_f.jpg
                    UUID uuid = UUID.randomUUID();
                    System.out.println(uuid.toString());
                    String path = getServletContext().getRealPath("Upload");
                    File file = new File(path);
                    if(!file.exists()){
                        file.mkdirs();
                    }
                    //拼接路径和图片名字(uuid生成的随机字符串拼接上图片名字)
                    File file1 = new File(file, uuid.toString() + "_" + fItem.getName());
                    IOUtils.copy(fItem.getInputStream(),new FileOutputStream(file1));
                    //存储的路径不能为绝对路径
                   //把图片路径字符串写进ImgUrl中 student.setImgUrl("Upload/"+uuid.toString() + "_" + fItem.getName());
                }else{
                    //通过key(getFieldNmae--表单的name属性值)获取value(getString--表单的value值)
                    String value = map.get(fItem.getFieldName());
                    //第一次存储
                    if(value == null){
                        map.put(fItem.getFieldName(),fItem.getString());
                    }else{//多次存储(多选框)
                        map.put(fItem.getFieldName(),value+","+fItem.getString());
                    }
                }
            }
            //把map集合的数据存放到student对象中
            BeanUtils.populate(student,map);
            request.setAttribute("stu",student);
            request.getRequestDispatcher("show.jsp").forward(request,response);
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (ServletException e) {
            e.printStackTrace();
        }
    }

文件下载

<body>
   <a href="Upload/a.jpg">下载</a><br/>
   <a href="DownloadServlet?path=Upload/a.jpg">下载</a>
</body>
//Upload/a.jpg
       String path = request.getParameter("path");
       //获取文件名
       String fileName = path.substring(path.lastIndexOf("/")+1);
       //转码
       fileName = URLEncoder.encode(fileName, "utf-8");
        //设置下载响应头
       response.setHeader("Content-disposition","attachment;fileName="+fileName);
        //获取下载图片的绝对路径
        path = getServletContext().getRealPath(path);
       FileInputStream fis = new FileInputStream(path);
       ServletOutputStream os = response.getOutputStream();
       IOUtils.copy(fis,os);
       os.close();
       fis.close();

   }

希望能够帮助到您

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值