• Java Web Day10


    本节内容

    1.文件上传与下载

    一、文件上传

     在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。

      对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。

     form表单提交的数据类型:enctype  :普通参数提交application/x-www-form-urlencoded

    文件上传  数据类型:multipart/form-data

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>文件上传</title>
    </head>
    <body>
    
      <form action="../UpLoadServlet" method="post" enctype="multipart/form-data">
      <input type="file" name="file1"/><br/>
      
      <input type="file" name="file1"/><br/>
      <input type="text" name="username"/><br/> 
      <input type="submit" value="上传"/>
      </form>
    
    </body>
    </html>
    View Code
    package com.xk.controller;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    
    /**
     * 文件上传
     * 
     * @author 27783
     *
     */
    @WebServlet("/UpLoadServlet")
    public class UpLoadServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            // 建立把保存文件上传的目录
            String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
    
            File file = new File(savePath);
    
            // 判断上传文件的保存目录是否存在
            if (!file.exists() && !file.isDirectory()) {
                System.out.println(savePath + "目录不存在,需要创建");
                // 创建目录
                file.mkdir();
            }
            // 上传消息提示
            String message = "";
    
            // 使用Apache文件上传组件处理文件上传步骤:
    
            // 1、创建一个DiskFileItemFactory工厂
    
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
    
            // 2、创建一个文件上传解析器
            ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
    
            // 3、判断提交上来的数据是否是上传表单的数据
            if (!ServletFileUpload.isMultipartContent(request)) {
    
                return;
            }
            // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
            // 解决上传文件名的中文乱码
            fileUpload.setHeaderEncoding("utf-8");
            try {
                List<FileItem> listFileitem = fileUpload.parseRequest(request);
    
                for (FileItem item : listFileitem) {
                    // 如果fileitem中封装的是普通输入项的数据
    
                    if (item.isFormField()) {
    
                        String name = item.getFieldName();
    
                        // 解决普通输入项的数据的中文乱码问题
                        String value = item.getString("utf-8");
    
                        System.out.println(name + " " + value);
                    } else {
                        // 如果fileitem中封装的是上传文件
                        // 得到上传的文件名称,
                        String filename = item.getName();
                        // 如果文件名为空跳过
                        if (filename == null || filename.trim().equals("")) {
                            continue;
                        }
                        // 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
                        // c:a1.txt,而有些只是单纯的文件名,如:1.txt
                        // 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
                        filename = filename.substring(filename.lastIndexOf("\") + 1);
                        // 获取item中的上传文件的输入流
                        InputStream in = item.getInputStream();
                        // 创建一个文件输出流
                        FileOutputStream out = new FileOutputStream(savePath + "\" + filename);
                        // 创建一个缓冲区
                        byte buffer[] = new byte[1024];
                        // 判断输入流中的数据是否已经读完的标识
                        int len = 0;
                        // 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
                        while ((len = in.read(buffer)) > 0) {
                            // 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\"
                            // + filename)当中
                            out.write(buffer, 0, len);
                        }
    
                        // 关闭输入流
                        in.close();
                        // 关闭输出流
                        out.close();
                        // 删除处理文件上传时生成的临时文件
                        item.delete();
                        message = "文件上传成功!";
    
                    }
    
                }
    
            } catch (FileUploadException e) {
                message = "文件上传失败!";
    
            }
        }
    
    }
    View Code

    文件下载:

    我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFileServlet,用于列出Web应用系统中所有下载文

     
    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>文件下载</title>
    </head>
    <body>
    
     <%
       String  fail=(String)request.getAttribute("fileinfo");
     
       if("fial".equals(fail)){%>
           
         <script type="text/javascript">
      
      
      alert("文件已不存在");
      
      
      </script>   
           
           
           
      <% }
     
     %>
    
     
    
    <a href="DowloadServlet?filename=Oracle第五天1.mm">Oracle第五天.mm</a>
    
    </body>
    </html>
    View Code
    package com.xk;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class DowloadServlet
     */
    @WebServlet("/DowloadServlet")
    public class DowloadServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
       
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
             
            String filename=request.getParameter("filename");
             
            System.out.println(filename);
         String savePath="G:"+File.separatorChar+"upload";
          
         File file = new File(savePath);
         
         File[] listFile= file.listFiles();
         
         
           for(File files:listFile){
               
               if(files.isFile()){
                   //文件名
                if(filename.equals(files.getName())){
                    
                    //文件存在
                     response.setContentType("application/octet-stream");
                     response.setHeader("content-disposition", "attachment;filename=""+filename+""");
                     File dowloadFile=new File(savePath+File.separatorChar+files.getName());
                     FileInputStream in = new FileInputStream(dowloadFile);
    
                    OutputStream out= response.getOutputStream();
                     byte[] b=new byte[1024];
                     int len=0;
                     while ((len=in.read(b))!=-1) {
                         
                          out.write(b, 0, len);
                         
                        
                    }
                     
                     out.close();
                     in.close();
                     return;
                    
                } 
       
               }
               
               
               
               
               
               
               
           }
         
            //文件不存在
           response.setContentType("text/html;charset=utf-8");
           request.setAttribute("fileinfo", "fial");
           
           request.getRequestDispatcher("/index1.jsp").forward(request, response); 
            
            
        }
    
         
    
    }
    View Code
     
     
     
  • 相关阅读:
    阿里fastjson工具类
    poi导出excel2007版本
    java 利用poi 实现excel合并单元格后出现边框有的消失的解决方法
    spring整合atomikos实现分布式事务
    彻底理解ThreadLocal
    kubernetes架构和组件
    Promethues实战-简易教程系列
    Celery
    对称加密,非对称加密,证书机制
    Git diff
  • 原文地址:https://www.cnblogs.com/wuzhilong/p/9518923.html
Copyright © 2020-2023  润新知