Java web 中实现简单的文件上传与下载——学习笔记

文件上传

主要步骤

 1.首先在上传jsp页面表单头里写上enctype="multipart/form-data"
 2.然后在处理的servlet里创建一个DiskFileItemFactory工厂
 3.创建一个文件上传解析器
 4.解析请求对象。parseRequest()方法,得到上传数据的集合
 5.遍历集合,判断上传的是否是文件
 6.上传文件的文件名处理
 7.write()方法写入服务器目录

上传页面的jsp代码

  <body>
    <form action="${pageContext.request.contextPath}/UploadServlet" enctype="multipart/form-data" method="post">
        上传用户:<input type="text" name="username"><br/>
        上传文件1:<input type="file" name="file1"><br/>
        上传文件2:<input type="file" name="file2"><br/>
        <input type="submit" value="提交">
    </form>
    <a href="InitDownloadServlet">下载</a>
  </body>

处理上传的servlet代码

protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // 1.得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
        String savePath = this.getServletContext()
                .getRealPath("WEB-INF/upload");
        File file = new File(savePath);
        // 判断上传文件的保存目录是否存在
        if (!file.exists()) {
            System.out.println(savePath + "目录不存在,需要创建");
            file.mkdir();
        }

        // 2、创建一个DiskFileItemFactory工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(1024 * 1024 * 3000); // 设置仓库的大小
        // 3、创建一个文件上传解析器
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 这里是写了一个进程监控。
        upload.setProgressListener(new ProgressListener() {

            @Override
            public void update(long arg0, long arg1, int arg2) {
                System.out.println("文件大小为:" + arg1 + ",当前已处理:" + arg0);
            }
        });
        // 解决上传文件名的中文乱码
        upload.setHeaderEncoding("utf-8");
        // 判断提交上来的数据是否是上传表单的数据
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 按照传统方式获取数据
            return;
        }
        // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,
        // 每一个FileItem对应一个Form表单的输入项
        List<FileItem> list = null;
        try {
            list = upload.parseRequest(request);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        if (list != null && list.size() > 0) {
            // 5.遍历上传所有的表单数据
            for (FileItem item : list) {
                // 如果fileitem中封装的是普通输入项的数据
                if (item.isFormField()) {
                    String name = item.getFieldName();
                    System.out.println(name);
                } else {
                    // 如果fileitem中封装的是上传文件
                    // 得到上传的文件名称
                    String filename = item.getName();
                    if (filename == null || "".equals(filename.trim())) {
                        continue;
                    }
                    // 6.由于浏览器的不同,获取的文件名的前缀可能不一致,所以需要处理
                    filename = filename
                            .substring(filename.lastIndexOf("\\") + 1);
                    //获取文件名称不包含后缀
                    String name = filename.substring(0,
                            filename.lastIndexOf("."));
                    // 截取文件扩展名
                    String extension = filename.substring(filename
                            .lastIndexOf("."));
                    // 重新构建文件名称 每次上传会在名字后面加上时间,解决了重复上传覆盖。
                    filename = name + new Date().getTime() + extension;
                    File savaFile = new File(file, filename);
                    try {
                        // 7.写入
                        item.write(savaFile);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    item.delete();
                    System.out.println(filename + " 文件上传成功");
                }
            }
        }
    }

文件的下载

文件下载比较简单,主要步骤如下:

 1. 设置文件ContentType类型
 2. 设置文件头
 3. 得到要下载的文件,并放入输入流中
 4. 通过响应对象获得输出流
 5. 边读取边写入

初始化获得服务器端文件的servlet代码

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // 获取服务器端下载的文件的路径
        String savePath = this.getServletContext()
                .getRealPath("WEB-INF/upload");
        // 通过服务器路径创建目录对象
        File downloadDir = new File(savePath);
        // 获取目录下面所有文件
        File[] files = downloadDir.listFiles();

        // 把文件数组对象保存到request对象中
        request.setAttribute("files", files);

        request.getRequestDispatcher("download.jsp").forward(request, response);
    }

处理下载的servlet代码

protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        String fileName = request.getParameter("fileName");
        fileName = new String(fileName.getBytes("iso-8859-1"), "UTF-8");

        String savePath = this.getServletContext().getRealPath(
                "/WEB-INF/upload");
        // 1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
        response.setContentType("multipart/form-data");

        // 2.设置文件头:最后一个参数是设置下载文件名
        response.setHeader("Content-Disposition", "attachment;filename="
                + URLEncoder.encode(fileName, "UTF-8"));

        File saveFile = new File(savePath, "/" + fileName);
        InputStream in = new FileInputStream(saveFile);
        OutputStream out = response.getOutputStream();
        byte[] bytes = new byte[512];
        int len = 0;
        while ((len = in.read(bytes)) != -1) {
            out.write(bytes, 0, len);
        }

        in.close();
        out.close();
    }
注:上面没有设置下载后文件的存放目录,默认的浏览器的下载目录,大部分浏览器都可以自行选择下载目录。当然自己也可以自己重写一个输出流,把文件写进去。
    学习笔记,如有不足之处,还望指正。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值