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

来源:互联网 发布:外文电子图书数据库有 编辑:程序博客网 时间:2024/04/26 17:46

文件上传

主要步骤

 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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 红米手机黑屏了怎么办 小米4s黑屏了怎么办 鼠标的左键失灵怎么办 小米5左键失灵怎么办 小米4左键失灵怎么办 小米5s左键失灵怎么办 单击鼠标左键就会自动删除?怎么办 华为五s开不开机怎么办 荣耀8关不了机怎么办 三星s7左键失灵怎么办 华为mate7死机黑屏了怎么办 小米手机max黑屏打不开怎么办 小米max开不了机怎么办 小米6接听电话声音小怎么办 小米手机接听电话声音小怎么办 小米5听筒声音小怎么办 红米手机不能开机怎么办 小米5x升级失败怎么办 安卓手机打电话黑屏怎么办 来电话就出黑屏怎么办 oppo手机停留在开机界面怎么办 小米4c死机了怎么办 苹果手机拨打电话时黑屏怎么办 华为畅享6黑屏怎么办 手机拨号键盘变小了怎么办 小米5s手机黑屏打不开怎么办 小米5s黑屏只能开关机怎么办 手机拨号键没了怎么办 华为手机桌面拨号图标不见了怎么办 华为手机拨号图标不见了怎么办 小米4s屏幕显示黑屏怎么办 平板拨号键没了怎么办 华为手机拨号图标没了怎么办 华为荣耀手机进水了怎么办 华为畅享7黑屏怎么办 华为畅玩7x黑屏怎么办 华为手机打电话时黑屏怎么办 三星a8手机黑屏打不开怎么办 华为手机恢复出厂后黑屏怎么办 华为荣耀4c白屏怎么办 华为荣耀6手机信号不好怎么办