文件上传与下载

文件上传

一.前提

1.提供form表单,且method=”post”
2.form表单属性:enctype为multipart/form-data
3.<input type="file"/>上传文件

二.Servlet操作

1.创建工厂类
2.使用工厂解析器对象
3.使用解析器解析request对象
4.获取表单并分类处理

三.代码

doGet代码

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //判断是否支持上传文件
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (isMultipart) {
            //创建工厂类
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setRepository(new File("e:\\"));//临时文件的保存目录
            //创建解析器对象
            ServletFileUpload fileUpload = new ServletFileUpload(factory);

            //解析request对象
            try {
                //限制上传文件不大于3M
                fileUpload.setFileSizeMax(1024*1024*3);
                //解决乱码,设置编码格式
                fileUpload.setHeaderEncoding("UTF-8");
                //获取表单项集合
                List<FileItem> list = fileUpload.parseRequest(request);
                if(list.isEmpty()){
                    //表单为空
                    throw new RuntimeException("上传为空");
                }
                //分类为普通表单和上传表单
                for (FileItem item : list) {
                    if (item.isFormField()) {
                        //普通表单
                        ProcessFormItem(item);
                    } else {
                        //上传表单
                        ProcessUploadItem(item);
                    }
                }
            }catch (FileUploadBase.SizeLimitExceededException e){
                throw new RuntimeException("文件过大,不能超过3M");
            }catch (FileUploadException e) {
                e.printStackTrace();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

目录按日期打散函数

private String makeChildDirectory(File storeDirector) {
        //按照日期来创建子目录
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
        String date = sdf.format(new Date());//将目前的日期转换为对应的字符串
        File file = new File(storeDirector,date);//在传入参数的目录下创建子目录
        if(!file.exists()){
            file.mkdir();//若文件不存在则创建一个
        }
        return date;
    }

上传表单处理函数

private void ProcessUploadItem(FileItem item) throws IOException {

        /*1.获取到解析后的输入流
          2.建立输入流和服务器储存资源位置
          3.IO*/

        //得到上传的名字
        String fileName = item.getName();
        if(fileName!=null){
            //解决文件带路径的问题
            fileName= FilenameUtils.getName(fileName);
        }
        if(fileName!=null){
            //解决文件重名的问题,随机数加下划线加名字
            fileName= UUID.randomUUID()+"_"+fileName;
        }
        //获取输入流
        InputStream inputStream=item.getInputStream();
        //得到存资源的路径
        String directRealPath = this.getServletContext().getRealPath("/upload");
        //由路径来打开文件夹
        File storeDirector =new File(directRealPath);
        //若文件夹不存在就建立一个
        if (!storeDirector.exists()){
            storeDirector.mkdir();
        }
        //避免所有的上传都在一个文件里面,需要打散目录
        String childDirectory = makeChildDirectory(storeDirector);
        //在当日对应文件夹中建立对应文件
        File file=new File(storeDirector,childDirectory+File.separator+fileName);
        //建立输出流
        FileOutputStream outputStream=new FileOutputStream(file);
        //IO
        int len=0;
        byte[] b=new byte[1024];
        while((len= inputStream.read(b))!=-1){
            outputStream.write(b,0,len);
        }
        //关闭输入输出
        outputStream.close();
        inputStream.close();
        item.delete();//删除临时文件
    }

普通表单处理

private void ProcessFormItem(FileItem item){
        String filedName = item.getFieldName();//获取字段名
        String filedValue=null;
        try {
            filedValue = item.getString("UTF-8");//获取字段值
            filedName=new String(filedName.getBytes("iso-8859-1"),"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        System.out.println(filedName+"="+filedValue);
    }

文件下载

doGet代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置一个要下载的文件
        String filename="班级账单.csv";
        //设置文件的编码
        if(request.getHeader("user-agent").toLowerCase().contains("msie")){
            //讲不安全的文件名改为UTF-8格式
            filename= URLEncoder.encode(filename,"UTF-8");
        }else{
            //火狐浏览器
            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");
        //创建一个文件输入流
        PrintWriter out=response.getWriter();
        out.write("团组织活动,100\n");
        out.write("聚餐,2000\n");
        out.write("练习册,400\n");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值