• 文件上传


    文件上传和下载的实质:文件的拷贝

    文件上传:从本地拷贝到服务器磁盘上   客户端需要编写文件上传表单---->服务端需要编写代码接受上传的 文件

    文件下载:从服务器磁盘上拷贝到本地磁盘   需要编写服务端的代码,客户端的下载的工作浏览器内核解决的

    一、文件上传
    1、文件上传的步骤:
    (1) 需要写一个文件上传表单
    (2) 编写服务器端的代码用于接收上传的文件

    2、服务端接受文件上传的表单数据

     文件上传接受原理

    使用方便快捷的文件上传的工具---Apache Commons-fileupload.jar

    使用步骤:
    (1) 下载文件上传的jar包 fileuplaod 借助于 commons-io.jar

    3、FileUpload工具中三个核心的对象
    DiskFileItemFactory:磁盘文件项工厂--一些相关的配置的设置 缓存的大小 临时目录的位置
    ServletFileUplaod:文件上传的一个核心类
    FileItem:代表每一个表单项
    4、文件上传的API的详解
    (1) DiskFileItemFactory
    设置缓存大小:factory.setSizeThreshold() 单位是字节
    设置临时文件的目录:factory.setRepository(File)
    (2) ServletFileUpload
    判断是否是一个文件上传的表单:ServletFileUpload.isMultipartContent(request);
    解析request获得表单项的集合:upload.parseRequest(request);
    设置上传的文件名的编码方式:upload.setHeaderEncoding("UTF-8");
    (3) FileItem
    判断是否是普通表单项:item.isFormField();
    获得表单的name属性值:item.getFieldName();
    获得表单的value值:item.getString("UTF-8") --- UTF-8表示获得中文时的编码
    获得上传文件的名称:item.getName()
    获得上传文件:item.getInputStream();
    删除临时文件:item.delete();

    没有临时文件:

        //接受上传文件
        
        //1、创建磁盘文件项工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //2、创建文件上传的核心类
        ServletFileUpload upload = new ServletFileUpload(factory);
        
        //3、解析request---获得文件项集合
        List<FileItem> parseRequest = upload.parseRequest(request);
    
        //4、遍历文件项集合
        for(FileItem item : parseRequest){
            //5、判断普通表单项/文件上传项
            boolean formField = item.isFormField();//是否是一个普通表单项
            if(formField){
                //普通表单项
                String fieldName = item.getFieldName();
                String fieldValue = item.getString();
                System.out.println(fieldName+":"+fieldValue);
            }else{
                //文件上传项
                //获得上传文件的名称
                String fileName = item.getName();
                //获得上传文件的内容
                InputStream in = item.getInputStream();
                //将in中的数据拷贝服务器上
                String path = this.getServletContext().getRealPath("upload");
                OutputStream out = new FileOutputStream(path+"/"+fileName);
                int len = 0;
                byte[] buffer = new byte[1024];
                while((len=in.read(buffer))>0){
                    out.write(buffer, 0, len);
                }
                
                in.close();
                out.close();
            }
        }
        
        
    } catch (FileUploadException e) {
        e.printStackTrace();
    }

    有临时文件:

    try {
    
        //1、创建磁盘文件项工厂
        //作用:设置缓存文件的大小  设置临时文件存储的位置
        String path_temp = this.getServletContext().getRealPath("temp");
        //DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024, new File(path_temp));
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(1024*1024);
        factory.setRepository(new File(path_temp));
        //2、创建文件上传的核心类
        ServletFileUpload upload = new ServletFileUpload(factory);
        //设置上传文件的名称的编码
        upload.setHeaderEncoding("UTF-8");
    
        //ServletFileUpload的API
        boolean multipartContent = upload.isMultipartContent(request);//判断表单是否是文件上传的表单
        if(multipartContent){
            //是文件上传的表单
            //***解析request获得文件项集合
            List<FileItem> parseRequest = upload.parseRequest(request);
            if(parseRequest!=null){
                for(FileItem item : parseRequest){
                    //判断是不是一个普通表单项
                    boolean formField = item.isFormField();
                    if(formField){
                        //username=zhangsan
                        String fieldName = item.getFieldName();
                        String fieldValue = item.getString("UTF-8");//对普通表单项的内容进行编码
                        
                        System.out.println(fieldName+"----"+fieldValue);
                        
                        //当表单是enctype="multipart/form-data"时 request.getParameter相关的方法
                        //String parameter = request.getParameter("username");
                        
                    }else{
                        //文件上传项
                        //文件的名
                        String fileName = item.getName();
                        //获得上传文件的内容
                        InputStream in = item.getInputStream();
                        String path_store = this.getServletContext().getRealPath("upload");
                        OutputStream out = new FileOutputStream(path_store+"/"+fileName);
                        IOUtils.copy(in, out);
                        in.close();
                        out.close();
                        
                        //删除临时文件
                        item.delete();
                        
                    }
                }
            }
    
        }else{
            //不是文件上传表单
            //使用原始的表单数据的获得方式 request.getParameter();
        }
    } catch (FileUploadException e) {
        e.printStackTrace();
    }
  • 相关阅读:
    MyBatis查询没有数据返回值为list还是null--------采坑
    Java弱引用WeakReference详细讲解
    idea debug调试详细教程
    [Docker]Dockerfile指令
    [Docker]Dockerfile定制容器
    [Docker]tomcat 404
    [Docker]容器操作
    [Docker]镜像操作
    [Docker]docker-ce安装
    [CentOS7]安装界面直接修改eth0
  • 原文地址:https://www.cnblogs.com/ms-grf/p/7222472.html
Copyright © 2020-2023  润新知