文件上传

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

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

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

一、文件上传
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();
}
原文地址:https://www.cnblogs.com/ms-grf/p/7222472.html