文件上传和下载

文件上传

  • 向服务器上传一个文件时,表单要使用post请求;
  • 表单的默认属性enctype=”application/x-www-form-urlencoded”
    这个属性的意思是请求体中的内容将会使用URL编码;
  • 当表单实现上传功能时 上传文件的表单enctype需要设置为 multipart/form-data
  • 当表单设置为multipart/form-data时,我们request.getParameter()将失效,我们不能再通过该方法获取请求参数
    使用步骤:
    1.获取工厂类实例[DiskFileItemFactory]
    2.获取解析器类实例[ServletFileUpload]
    3.解析request获取FileItem[parseRequest()]

实现代码:

        request.setCharacterEncoding("utf8");
        DiskFileItemFactory factory=new DiskFileItemFactory();
        ServletFileUpload fileupload=new ServletFileUpload(factory);
        fileupload.setFileSizeMax(1024*50);
        ServletContext servletcontext=request.getServletContext();
        String realPath = servletcontext.getRealPath("/upload");
        File file=new File(realPath);
        System.out.println(realPath);
        if(!file.exists()) {
            file.mkdir();
        }
        try {
            List<FileItem> parseRequest = fileupload.parseRequest(request);
            for(FileItem item:parseRequest){
                if(item.isFormField()){
                    String name=item.getFieldName();
                }else{
                    long size=item.getSize();
                    if(size==0) {
                        continue;
                    }
                    String contentType = item.getContentType();
                    String name=item.getName();
                    //在String字符串中\为转义符
                    if(name.contains("\\")) {
                        name=name.substring(name.lastIndexOf("\\")+1);
                    }
                    //保持文件名唯一性
                    String flag=UUID.randomUUID().toString();
                    flag=flag.replace("-", "");
                    String fileName=flag+"_"+name;
                    try {
                        item.write(new File(realPath+"\\"+fileName));
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }catch (FileSizeLimitExceededException e) {
            System.out.println("�ļ���С����");
        } 
        catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

文件下载

        ServletContext servletContext = request.getServletContext();
//       String fileName = URLEncoder.encode("琵琶语_林海.mp3", "utf-8");
        String fileName="琵琶语_林海.mp3";
        String path=servletContext.getRealPath("/WEB-INF/"+fileName);
        //将字符串用gbk进行解码,然后在使用iso8859-1进行编码
        fileName = new String(fileName.getBytes("gbk"),"iso8859-1");
        File file=new File(path);
        //获取下载文件类型
        String type = servletContext.getMimeType(path);
        response.setContentType(type);
        /*Content-Disposition告诉浏览器如何处理文件,
        attachment 告诉浏览器这个文件是一个附件的形式发给你的,需要你做下载的操作
        filename 告诉浏览器下载文件的名字*/
        response.setHeader("Content-Disposition","attachment; filename="+fileName);
        //先读后写,再拷贝
        InputStream in=new FileInputStream(file);
        PrintWriter out=response.getWriter();
        IOUtils.copy(in, out);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值