2.1 学习总结 之文件上传

 一、文件上传知识简介

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

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

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

4、文件上传的步骤:

1) 、需要写一个文件上传表单

2)、 编写服务器端的代码用于接收上传的文件

5、注意事项:

做文件上传时客户端需要满足的三个条件

1)、提交方式必须是post方式提交 即:method="post"。

2)、文件类型的input标签必须要有name属性

3)、form表单必须是一个多部分表单即:enctype="multipart/form-data"

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

7、FileUpload工具中三个核心的对象

1)、DiskFileItemFactory:磁盘文件项工厂--一些相关的配置的设置  缓存的大小 临时目录的位置

2)、ServletFileUplaod:文件上传的一个核心类

3)、FileItem:代表每一个表单项

二、文件上传的原理分析

 三、文件上传的API的详解

 

 四、代码

1、简单界面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="upload" method="post" enctype="multipart/form-data">
        <input type="text" name="username"><br>
        <input type="file" name="filename"><br>
        <input type="submit" value="上传文件">
    </form>
</body>
</html>

 2、servlet

package com.me.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
@WebServlet("/upload")
public class FileuplodeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public FileuplodeServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        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();
        }

    }

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

}

五、运行测试

 

 

原文地址:https://www.cnblogs.com/20183544-wangzhengshuai/p/12249587.html