• 上传下载,使用,commons-fileupload,commons-io来加载上传下载


    导入两个jarcommons-fileupload.jar,和commons-io.jar

    在请求中创建核心类

    1 // 1. 创建工厂对象
    2 FileItemFactory factory = new DiskFileItemFactory();
    3 // 2. 文件上传核心工具类
    4 ServletFileUpload upload = new ServletFileUpload(factory);

    对上传文件进行设置

    // 设置大小限制参数
                upload.setFileSizeMax(10*1024*1024);    // 单个文件大小限制
                upload.setSizeMax(50*1024*1024);        // 总文件大小限制
                upload.setHeaderEncoding("gbk");        // 对中文文件编码处理

    判断是否是上传文件

    upload.isMultipartContent(request);//就是判断enctype="multipart/form-data",如果enctype是multipart,那么就是一个上传文件

    下面获取上传request的数据封装集合

    List<FileItem> list = upload.parseRequest(request);

    对FileItem遍历和判断

    item.isFormField();判断这个item是不是文件,还是说这个是表单项,真就是普通的文本数据,假就是文件

    上传代码

    /*********文件上传组件: 处理文件上传************/
            try {
                // 1. 文件上传工厂
                FileItemFactory factory = new DiskFileItemFactory();
                // 2. 创建文件上传核心工具类
                ServletFileUpload upload = new ServletFileUpload(factory);
                // 一、设置单个文件允许的最大的大小: 30M
                upload.setFileSizeMax(30*1024*1024);
                // 二、设置文件上传表单允许的总大小: 80M
                upload.setSizeMax(80*1024*1024);
                // 三、 设置上传表单文件名的编码
                // 相当于:request.setCharacterEncoding("UTF-8");
                upload.setHeaderEncoding("UTF-8");
                
                // 3. 判断: 当前表单是否为文件上传表单
                if (upload.isMultipartContent(request)){
                    // 4. 把请求数据转换为一个个FileItem对象,再用集合封装
                    List<FileItem> list = upload.parseRequest(request);
                    // 遍历: 得到每一个上传的数据
                    for (FileItem item: list){
                        // 判断:普通文本数据
                        if (item.isFormField()){
                            // 普通文本数据
                            String fieldName = item.getFieldName();    // 表单中元素名称
                            String content = item.getString();        // 表单中元素名称里所对应的数据
                            //item.getString("UTF-8");  指定编码
                            System.out.println(fieldName + " " + content);
                        }
                        // 上传文件(文件流) ----> 上传到upload目录下
                        else {
                            // 普通文本数据
                            String fieldName = item.getFieldName();    // 表单中的元素名称
                            String name = item.getName();            // 文件名,上传文件的名称                
                            String content = item.getString();        // 表单元素名称, 对应的数据,如果事文本就会返回文本,如果事二进制返回乱码
                            String type = item.getContentType();    // 文件类型,是图片,文本,压缩包等
                            InputStream in = item.getInputStream(); // 上传文件流
                            
                            /*
                             *  四、文件名重名
                             *  对于不同用户readme.txt文件,不希望覆盖!
                             *  后台处理: 给用户添加一个唯一标记!
                             */
                            // a. 随机生成一个唯一标记
                            String id = UUID.randomUUID().toString();
                            // b. 与文件名拼接
                            name = id +"#"+ name;
                            
                            // 获取上传基路径
                            //String path = getServletContext().getRealPath("/upload");
                            String path = "e:\upload";
                            // 创建目标文件
                            File file = new File(path,name);
                            
                            // 工具类,文件上传
                            item.write(file);
                            item.delete();   //删除系统产生的临时文件,这个是一个占内存的中转数据,没用,应该删除
                            System.out.println(path);
                        }
                        
                    }
                    
                }
                else {
                    System.out.println("当前表单不是文件上传表单,处理失败!");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            

    下载

    首先需要获取下载列表中的内容

    如下servlet

        
            // 实现思路:先获取upload目录下所有文件的文件名,再保存;跳转到down.jsp列表展示
            
            //1. 初始化map集合Map<包含唯一标记的文件名, 简短文件名>  ;
            Map<String,String> fileNames = new HashMap<String,String>();
            
            //2. 获取上传目录,及其下所有的文件的文件名
            //String basePath = getServletContext().getRealPath("/upload");
            String basePath = "e:\upload";
            // 目录
            File file = new File(basePath);
            // 目录下,所有文件名
            String list[] = file.list();
            // 遍历,封装
            if (list != null && list.length > 0){
                for (int i=0; i<list.length; i++){
                    // 全名
                    String fileName = list[i];
                    // 短名
                    String shortName = fileName.substring(fileName.lastIndexOf("#")+1);
                    // 封装
                    fileNames.put(fileName, shortName);
                }
            }
            
            // 3. 保存到request域
            request.setAttribute("fileNames", fileNames);
            // 4. 转发
            request.getRequestDispatcher("/downlist.jsp").forward(request, response);
    
        

    在另外一个jsp中 显示

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        
        <title>下载列表</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
      </head>
      
      <body>    
        <table border="1" align="center">
            <tr>
                <th>序号</th>
                <th>文件名</th>
                <th>操作</th>
            </tr>
            <c:forEach var="en" items="${requestScope.fileNames}" varStatus="vs">
                <tr>
                    <td>${vs.count }</td>
                    <td>${en.value }</td>
                    <td>
                        <%--<a href="${pageContext.request.contextPath }/fileServlet?method=down&..">下载</a>--%>
                        <!-- 构建一个地址  -->
                        <c:url var="url" value="fileServlet">
                            <c:param name="method" value="down"></c:param>
                            <c:param name="fileName" value="${en.key}"></c:param>
                        </c:url>
                        <!-- 使用上面地址 -->
                        <a href="${url }">下载</a>
                    </td>
                </tr>
            </c:forEach>
        </table>          
      </body>
    </html>

    点击下载后,跳到下载方法中

    /**
         *  3. 处理下载
         */
        private void down(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            
            // 获取用户下载的文件名称(url地址后追加数据,get)
            String fileName = request.getParameter("fileName");
         //GET方式获得的汉字需要转码 fileName
    = new String(fileName.getBytes("ISO8859-1"),"UTF-8"); // 先获取上传目录路径 //String basePath = getServletContext().getRealPath("/upload"); String basePath = "e:\upload"; // 获取一个文件流 InputStream in = new FileInputStream(new File(basePath,fileName)); // 如果文件名是中文,需要进行url编码 fileName = URLEncoder.encode(fileName, "UTF-8"); // 设置下载的响应头 response.setHeader("content-disposition", "attachment;fileName=" + fileName); // 获取response字节流 OutputStream out = response.getOutputStream(); byte[] b = new byte[1024]; int len = -1; while ((len = in.read(b)) != -1){ out.write(b, 0, len); } // 关闭 out.close(); in.close(); }

    至此,下载完成,注意中文情况下,下载需要进行编码

  • 相关阅读:
    科技小论文
    一线架构—细化架构
    python20.04.10
    软件架构总结
    信息领域热词分析
    架构即未来阅读笔记二
    构架即未来阅读笔记一
    科技小论文之软件质量
    Pre-architecture的需求
    软件质量
  • 原文地址:https://www.cnblogs.com/renboqie/p/5678209.html
Copyright © 2020-2023  润新知