• JavaWeb:servlet实现下载与上传功能



    本文内容:

    • servlet实现下载功能
    • servlet实现上传功能

    首发日期:2018-07-21


    servlet实现下载功能

    实现流程

    1.首先制作一个jsp页面,主要是用来触发下载的。这里可以根据你的想法来做,当然servlet那边就要相应的更改了。我这里使用一个简单的a标签来触发。

    image

    2.设置响应信息,告诉浏览器要将传过来的数据识别成下载;根据提交上来的数据找到对应文件,转成流,返回给浏览器;

    image

    中文文件名问题:

    • 虽然真的不建议使用中文文件名。但还是给一下处理手段。

    先给出触发的条件:image

    中文文件名需要解决两个问题:

    1.浏览器提交上来的中文文件名要识别:这里是普通的get和post的中文数据问题

    get方式:String filename = new String(filename.getBytes("iso-8859-1"),"utf-8"); 【tomcat8不需要】

    post方式:request.setCharacterEncoding("utf-8")

    2.返回给浏览器时,浏览器能识别,即能正确显示回来的下载文件名(如果你下载东西遇到过文件名乱码,就是这个没处理好):

    处理方法:

    image

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 1.获取下载目标
            String filename = request.getParameter("target");
            System.out.println(filename);
            // 2.找到下载目标
            String path = getServletContext().getRealPath("download/" + filename);
            File file = new File(path);
            if (file.exists()) {
                // 3.如果文件存在,那么设置响应的内容为下载,告诉浏览器将信息识别成下载
                // 判断一下浏览器
                String agent = request.getHeader("User-Agent");
                if (agent.contains("Firefox")) {// 火狐
                    BASE64Encoder base64Encoder = new BASE64Encoder();
                    filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
                } else {// ie和谷歌
                    filename = URLEncoder.encode(filename, "utf-8");
                }
                response.setHeader("Content-Disposition", "attachment; filename=" + filename);
                // 4.获取文件流
                FileInputStream fis = new FileInputStream(file);
                OutputStream os = response.getOutputStream();
                // 5.返回给浏览器
                int len = 0;
                byte[] buffer = new byte[1024];
                while ((len = fis.read(buffer)) != -1) {
                    os.write(buffer, 0, len);
                }
                os.flush();// flush一下,确保一下
                os.close();
                fis.close();
            } else {
                response.setContentType("text/html;charset=UTF-8");
                response.getWriter().write("找不到文件");
            }
    
        }

    servlet实现上传功能

    1.创建一个页面,用于上传:【这里只用了一个上传,但事实上下面的代码是支持多个上传的

    image

    【当使用了enctype="multipart/form-data"之后,普通输入框的内容,将无法使用getParameter获取

    2.导入包,以便使用fileupload:commons-fileupload-1.2.1.jar和commons-io-1.4.jar【这里导入io包主要是用于io流对接,上传的文件流直接对接输出流;如果你不导入,那么需要手动处理流中的数据!】

    3.创建DiskFileItemFactory工厂类,用来:DiskFileItemFactory factory=new DiskFileItemFactory();

    4.创建解析类,用于解析resquest:ServletFileUpload upload=new ServletFileUpload(factory);

    5.解析内容,获取一个list,数据都存储在list中:List<FileItem> list = upload.parseRequest(request);

    现在信息封装方法已经跟之前没有文件上传时不一样了,所以需要解析:

    image

    6.操作list【list中的每一个元素都是FileItem对象,可以用FileItem对象.isFormField()来判断是否是表单项(认为文件是上传项);如果是真的话,说明是普通的输入框内容,如果你想要存储输入框提交的内容,那么这里可以处理一下;不为真说明是上传项,这里可以针对流进行操作】

    如何操作?

    对于普通表单项:item.getFieldName()可以获取对应的name;item.getString()可以获取对应的值

    对于上传项,需要操作它的流:item.getInputStream()可以获取对应的数据流。

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            DiskFileItemFactory factory=new DiskFileItemFactory();//1.创建DiskFileItemFactory工厂类
            ServletFileUpload upload=new ServletFileUpload(factory);//2.创建解析类,用于解析resquest
            try {
                List<FileItem> list = upload.parseRequest(request);//3.解析内容,获取一个list,数据都存储在list中
                for(FileItem item:list) {
                    if(item.isFormField()) {//判断是否是普通的表单内容
                        System.out.println(item.getFieldName());//获取的是表单中name属性的值
                        System.out.println(item.getString());//获取的是对应的表单的值
                    }else {//为假,说明是上传项
                        //获取流,进行处理
                        InputStream ism = item.getInputStream();
                        String path=getServletContext().getRealPath("/upload/");
                        System.out.println(path);
                        String filename = item.getName();//这里getName可以获取文件名
                        System.out.println(filename);
                        File file=new File(path+filename);
                        file.createNewFile();//这里不做文件存在性和名字重复判断
                        OutputStream fos = new FileOutputStream(file);
                        //这里直接借助commons.io来做io对接,不然需要做流的读取和写入
                        IOUtils.copy(ism,fos);//把输入流的数据拷贝到输出流
                        IOUtils.closeQuietly(ism);
                        IOUtils.closeQuietly(fos);
                        
                    }
                }
            } catch (FileUploadException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
        }

  • 相关阅读:
    ECSHOP文章详情页的标题上加个链接
    点击复制代码到粘贴板代码
    ecshop商城用户名和邮箱都能登陆方法
    ECSHOP商品页发表评论时 取消EMAIL必填
    ECSHOP 模板结构说明
    ecshop文章分类页 显视当前文章分类名称及商品分类页显视当前分类名称
    ecshop商城用户名和邮箱都能登陆方法
    Ecshop品牌页如何自定义Title
    常见的颜色搭配、衣裤搭配指南
    ECSHOP首页显示积分商城里的商品
  • 原文地址:https://www.cnblogs.com/progor/p/9347823.html
Copyright © 2020-2023  润新知