文件上传入门

使用commons-fileupload
1.导入jar包
    commons-fileupload-1.2.1.jar  文件上传
    commons-io-1.4.jar 它是提供的io工具.
    介绍commons-fileupload
        它有三个核心
            1.DiskFileItemFactory类
            2.ServletFileUpload类
            3.FileItem
            
2.快速入门:
        1.创建upload2.jsp页面
            <form action="${pageContext.request.contextPath}/upload2" method="post" encType="multipart/form-data">
                <input type="file" name="f"><br>
                <input type="submit" value="上传">
            </form>
        2.创建Upload2Servlet
            1.创建一个DiskFileItemFactory
                DiskFileItemFactory factory=new DiskFileItemFactory();
            2.创建ServletFileUpload类                    
                ServletFileUpload upload=new ServletFileUpload(factory);                    
            3.解析所有上传数据
                List<FileItem> items = upload.parseRequest(request);
                
        3.了遍历items集合,集合中的每一项,就是一个上传数据.
            1.isFormField();
                
            2.getFieldName();
                返回值String,得到组件名称  <input name="">
            3.getName();
                返回值是String,得到的是上传文件的名称.
                注意:浏览器不同,它们得到的效果不一样。
                    1.包含全路径名称  例如: C:\Users\Administrator\Desktop\a.txt
                    2.只包含上传文件名称 例如:a.txt
                    
            4.getString();
                这个方法可以获取非上传组件的内容,相当于  getParameter方法作用。
                
                如果是上传组件,上传的文件是文本文件,可以获取到文件文件的内容。
                但是如果不是文件文件,例如:是一张图片,这样获取合适吗?
                    
            5.获取上传文件的内容,保存到服务器端.
                item.getInputStream();它是用于读取上传文件内容的输入流.
                使用文件复制操作就可以完成文件上传。
                
                IOUtils.copy(item.getInputStream(), fos);

文件上传步骤

  1. 实现步骤

1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录

2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。

3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。

4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件

      • True 为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值
      • False 为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据。

package cn.learn.web.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.servlet.ServletException;
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;

public class Upload2Servlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 1.创建 DiskFileItemFactory
		DiskFileItemFactory factory = new DiskFileItemFactory();

		// 2.创建
		ServletFileUpload upload = new ServletFileUpload(factory);

		try {
			// 底层通过request获取数据,进行解析,将解析的数据封装到List<FileItem>
			List<FileItem> items = upload.parseRequest(request);

			// 3.遍历集合
			for (FileItem item : items) {

				if (item.isFormField()) {
					// 这就是得到了<input type="text" name="content">这样的组件
					// String fieldName = item.getFieldName();
					// System.out.println(fieldName);
					//
					// String name = item.getName();
					// System.out.println(name);
					//
					// String msg = item.getString();
					// System.out.println(msg);
				} else {
					// 这就是得到了<input type="file"> 这样的组件.
					// String fieldName = item.getFieldName();
					// System.out.println("上传组件的名称:" + fieldName);
					//
					String name = item.getName(); // 上传文件名称
					System.out.println(name);
					name = name.substring(name.lastIndexOf("\\") + 1);
					// System.out.println("上传组件:" + name);
					//
					// String msg = item.getString();
					// System.out.println(msg);

					// 获取上传文件内容,完成文件 上传操作
					// InputStream is = item.getInputStream();
					// byte[] b = new byte[1024];
					// int len = -1;
					FileOutputStream fos = new FileOutputStream("d:/upload/"
							+ name);
					// while ((len = is.read(b)) != -1) {
					//
					// fos.write(b, 0, len);
					//
					// }
					// fos.close();
					// is.close();

					IOUtils.copy(item.getInputStream(), fos);

				}

			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}

	}

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

}
发布了2417 篇原创文章 · 获赞 62 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/Leon_Jinhai_Sun/article/details/105153411