文件上传与下载

一、文件上传

  • 一、前台
        1、提交方式:post
        2、表单中有文件上传的表单项:<input type=”file” />
        3、指定表单类型:
            默认类型:enctype="application/x-www-form-urlencoded"
            文件上传类型:multipart/form-data
  • 二、后台
        手动
            InputStream in =  request.getInputStream();
            InputStreamReader inStream = new InputStreamReader(in, "UTF-8");
            BufferedReader reader = new BufferedReader(inStream);
            String str = null;
            while ((str = reader.readLine()) != null) {
                System.out.println(str);
            }
            // 关闭
            reader.close();
            inStream.close();
            in.close();
            注意:最终获取数据,要对上面的结果进行解析!
        自动 使用Apache提供的文件上传组件:FileUpload组件
            1、项目中引入jar文件
                commons-fileupload-1.2.1.jar  【文件上传组件核心jar包】
                commons-io-1.4.jar     【封装了对文件处理的相关工具类】
            2、代码
                // 文件上传工厂
                FileItemFactory factory = new DiskFileItemFactory();
                // 创建文件上传核心工具类
                ServletFileUpload upload = new ServletFileUpload(factory);
                // 设置单个文件允许的最大的大小:30M
                upload.setFileSizeMax(30*1024*1024);
                // 设置文件上传表单允许的总大小: 80M
                upload.setSizeMax(80*1024*1024);
                // 设置上传表单文件名的编码
                upload.setHeaderEncoding("UTF-8");
                // 判断:当前表单是否为文件上传表单
                if (upload.isMultipartContent(request)){
                    // 把请求数据转换为一个个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(); // 上传文件流
                            /*
                             *  文件名重名
                             *  对于不同用户的文件,不希望覆盖!
                             *  后台处理:给用户添加一个唯一标记!
                             */
                            // 随机生成一个唯一标记
                            String id = UUID.randomUUID().toString();
                            // 与文件名拼接
                            name = id +"#"+ name;
                            // 获取上传基路径
                            String path = getServletContext().getRealPath("/upload");
                            // 创建目标文件
                            File file = new File(path,name);
                            // 工具类,文件上传
                            item.write(file);
                            item.delete();   //删除系统产生的临时文件
                        }
                    }
                }

二、文件下载

  • 一、前台(略)
  • 二、后台
        1、代码
            // 获取用户下载的文件名称
            String fileName = request.getParameter("fileName");
            fileName = new String(fileName.getBytes("ISO8859-1"), "UTF-8");
            // 先获取上传目录路径
            String basePath = getServletContext().getRealPath("/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();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值