文件的上传和下载

一、文件的上传:

@WebServlet(name = "UpLoadFileServlet")
public class UpLoadFileServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");

        //用输入流输入到控制台打印出来
        try {
            ServletInputStream inputStream = request.getInputStream();
            byte[] bytes = new byte[1024];
            int total=-1;
            while((total=inputStream.read(bytes))!=-1){
                System.out.print(new String(bytes,0,total));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //检查我们是否有文件上传请求
        boolean isMultipart  = ServletFileUpload.isMultipartContent(request);
        if (isMultipart) {
            //为基于磁盘的文件创建一个工厂
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            //创建一个新的文件上传程序
            ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);
            //解析请求
            try {
                List<FileItem> items = upload.parseRequest(request);
                //处理上传的文件项目
                Iterator iterator = items.iterator();
                while (iterator.hasNext()) {
                    FileItem item = (FileItem) iterator.next();
                    if (item.isFormField()) {
                        //普通域
                        processFormField(item);
                    }else {
                        //文件域
                        processUpLoadFile(item,request);
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
        }
    }
    //处理文件域
    private void processUpLoadFile(FileItem item, HttpServletRequest request) {
        //获取文件的相关信息
        String fieldName = item.getFieldName();
        System.out.println("fieldName----->"+fieldName);

        String filename = item.getName();
        System.out.println("fileName------>"+filename);

        String contentType = item.getContentType();
        System.out.println("contentType---->"+contentType);

        long size = item.getSize();
        System.out.println("size-------->"+size);
        //转储文件到服务器上
        //存储文件的根路径
        /**
         * 他是转储到了工程发布出去的文件中,就是out文件夹下的artifacts--UploadFileDemo_war_exploded---web-inf--upload文件夹
         *
         */
        String realPath = request.getServletContext().getRealPath("/WEB-INF/upload");
        File dir = new File(realPath);
        if (!dir.exists()) {
            //文件夹如果不存在就自动创建
            dir.mkdirs();
        }

        //写文件
        File file = new File(realPath + "/" + filename);
        try {
            item.write(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //处理普通域
    private void processFormField(FileItem item) {
        String fieldName = item.getFieldName();//获取文件的名字
        String value = null;
        try {
            /**
             * String getString()。getString()方法将FileItem对象中保存的数据流内容以一个字符串返回。
             * 它有两个重载形式。
             * public java.lang.String getString()和
             * public java.lang.String getString(java.lang.String encodeing) throws java.io.UnsupportedEncodingException。
             *
             * 前者   使用缺省的字符集编码将主体内容转换成字符串,
             * 后者   使用参数指定的字符集编码。
             *
             * 如果在读取普通表单字段元素的内容时,出现了乱码现象,可以调用第二个方法,并传入 正确的字符集编码名称。
             *
             */
            //用UTF-8编码以字符串形式输出
            value = item.getString("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println(fieldName+"------>"+value);
    }

 

二、文件的下载:

 

@WebServlet(name = "DownLoadFileServlet")
public class DownLoadFileServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //通过超链接方式都是get方法访问服务器
        String file = request.getParameter("file");

        //下载
        String filePath = "";
        String fileName = "";

        switch (file) {
            case "mp3":
                fileName="拔萝卜.mp3";
                filePath=request.getServletContext().getRealPath("/WEB-INF/resources/拔萝卜.mp3");
                break;
            case "jpg":
                fileName="pic5.jpg";
                filePath=request.getServletContext().getRealPath("/WEB-INF/resources/pic5.jpg");
                break;
            case "jar":
                fileName="mysql.jar";
                filePath=request.getServletContext().getRealPath("/WEB-INF/resources/mysql-connector-java-5.1.7-bin.jar");
                break;
        }




        //针对IE或者以IE为内核的浏览器:
        String userAgent = request.getHeader("User-Agent");
        if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
            fileName = URLEncoder.encode(fileName, "UTF-8");
        } else {
            //非IE浏览器的处理:
            fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
        }

        //显示下载的文件名称
        response.setHeader("content-disposition", "attachment;filename="+fileName);

        //设置返回的文件类型,我们可以根据文件名称自动获取其类型
        response.setContentType(this.getServletContext().getMimeType(fileName));

        //处理文件名称中文的乱码
        response.setCharacterEncoding("UTF-8");

        //写数据-----边读边输出
        FileInputStream fileInputStream = new FileInputStream(filePath);
        ServletOutputStream outputStream = response.getOutputStream();
        byte[] bytes = new byte[1024];
        int total = -1;
        while((total=fileInputStream.read(bytes))!=-1){
            outputStream.write(bytes,0,total);
        }
        fileInputStream.close();
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值