javaweb文件上传(2)

使用commons-fileupload.

    1.导入jar包(链接:commons-fileupload-1.2.1.jar密码: q9p6)

            commons-fileupload-1.2.1.jar  文件上传

            commons-io-1.4.jar 它是提供的io工具.

            介绍commons-fileupload

                        1.DiskFileItemFactory类

                        2.ServletFileUpload类

                        3.FileItem

    2.快速入门:

            1.创建upload2.jsp页面

            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);


代码实现:

    lib中导入两个jar包.

    在javaweb文件上传(1)的项目里面添加upload2.jsp页面,还要添加一个Upload2Servlet的servlet文件.

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/upload2" method="post" encType="multipart/form-data">
		<input type="text" name="content"><br>
		<input type="file" name="f"><br>
		<input type="submit" value="上传">
	</form>
  </body>
</html>

servlet的代码实现.

package cn.itcast.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;

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);
			
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
	}

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

然后运行服务器,输入good,上传a.txt文件,在浏览器运行,抓包得到如下.


servlet中的List<FileItem> 就是这些分割的内容,就相当于得到了这个文本的内容.



然后修改服务器的upload2servlet的代码,如下所示.

package cn.itcast.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);
				} else {
					// 这就是得到了<input type="file"> 这样的组件.
					String fieldName = item.getFieldName();
					System.out.println("上传组件的名称:" + fieldName);
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}

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

此时上传文件,在控制台输出.


String filename = item.getFileName();如下图所示.


接下来再修改upload2servlet.java文件的内容.

package cn.itcast.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);
					
					 String msg = item.getString();
					 System.out.println(msg);
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

此时控制台打印输出.


结构图分析得到,getFileName();  good  0123456789   getString();.


getString();

                这个方法可以获取非上传组件的内容,相当于  getParameter方法作用。

                如果是上传组件,上传的文件是文本文件,可以获取到文件文件的内容。

                但是如果不是文件文件,例如:是一张图片,这样获取合适吗?

获取上传文件的内容,保存到服务器端.

                 item.getInputStream();它是用于读取上传文件内容的输入流.

                 使用文件复制操作就可以完成文件上传。

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

故修改upload2servlet.java类的文件.

package cn.itcast.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);
					//
					// String msg = item.getString();
					// System.out.println(msg);


					// 获取上传文件内容
					 InputStream is = item.getInputStream();
					 byte[] b = new byte[1024];
					 int len = -1;
					 while ((len = is.read(b)) != -1) {
					 System.out.print(new String(b,0,len));
					 }
					 is.close();
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

控制台打印输出得到.


若我此时上传一张图片,控制台则会打印出乱码.


但是我们最终的目的是复制文件,而不是打印到控制台输出所以修改一下upload2servlet.java的代码.

package cn.itcast.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(); // 上传文件名称,但是包含了全路径,所以截取出来,如下代码.
					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();
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
然后上传文件后就可以将文件复制到指定的目录下面了 :  d:/upload/

因为我们前面导入了commons-io.jar的包,所以可以简化一些代码,直接用里面的类.

package cn.itcast.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);
	}
}
也可以将上传的文件直接复制到了,指定的目录中.




猜你喜欢

转载自blog.csdn.net/superman___007/article/details/80877754