jsp显示层:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>文件上传</title> </head> <body> <form action="${pageContext.servletContext.contextPath }/servlet/UpLoadDemo02" method="POST" enctype="multipart/form-data"> 请选择要上传的文件:<input type="file" name="attachment" /> <input type="submit" value="上传文件"/> </form> </body> </html>
servlet中的逻辑:
package upload; import java.io.File; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FileUtils; /** * 我们这里开始使用apache的文件上传和下载的组件 * 1.导入jar包 * commons-fileload-1.2.2.jar * commons-io-2.1.jar 一个IO流工具(更方便) * 2.核心的API * DiskFileItemFactory类:用于设置上传文件的缓存大小和缓存目录。 * servletFileUpload:用于解析上传的所有文件。 * List<FileItem> parseRequest(HttpServletRequest request) * 返回的FileItem对象: * 代表一个上传的文件。 * 文件名称 * 文件大小 * 文件类型 * 文件内容 * @author mzy * */ public class UpLoadDemo02 extends HttpServlet { private static final long serialVersionUID = 987003232758385500L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // 1.创建一个DiskFileItemFactory对象,用于设置缓存大小和缓存目录 /* * 参数一:缓存大小 * 如果文件大小小于缓存,那么就不通过缓存,直接传到服务器; * 如果文件大小大于缓存,那么就先把文件存储到缓存目录 * (然后再从缓存目录到指定的目录中: * 缓存文件的大小等于上传文件的大小,并非等于指定缓存的大小 * 例如文件大小为49KB,缓存大小指定的是10KB,那么缓存中的文件大小为49KB。 * 如果文件大小为9Kb,缓存大小指定的是10KB,那么缓存中没有文件。 * )。 * 参数二:缓存目录 * 可以看出这里的缓存和我们在流中接触到的Buffer之类的不同,这里的缓存是实打实的能在外存找到的 * 系统文件夹中的缓存。 */ // 单位是b:10KB 给定一个缓存的目录 // 必须要自己先到e:/下:去新建一个temp的目录;才会有文件缓存到e:/temp/ 中去 // 不然会报:java.io.FileNotFoundException: e:\temp\ upload_68564f96_163548425a3__8000_00000003.tmp (系统找不到指定的路径。) // 注意: 这里加了一个空格 因为\ u 会报错! DiskFileItemFactory factory = new DiskFileItemFactory(10*1024, new File("e:/temp")); // 默认的缓存大小就是10KB // 2.使用servletFileUpLoad解析文件:使用DiskFileItemFactory构造 ServletFileUpload upload = new ServletFileUpload(factory); // 3.解析文件 // 该方法会自动读取请求的实体内容中所有上传文件的信息。 // List:可以是多个文件 List<FileItem> list = upload.parseRequest(request); /* * 设置文件头编码,来解决某些服务端默认编码造成的中文乱码问题! */ upload.setHeaderEncoding("utf-8"); // 将上传的文件的信息读取出来 if(list != null) { // 取出第一个文件 FileItem item = list.get(0); // 文件信息 /* * 1.文件名字: * getName: * 返回客户端文件系统中的原始文件名;由浏览器 * (或其他客户端软件)提供;但是,一些客户端, * 如Opera浏览器,包含路径信息。 * * getFieldName: * 返回与此文件项对应的多部件表单中的字段名称。 * * 所以不能使用getFiledName * 返回的是表单中名称,并不是实际文件的名字! */ String name = item.getName(); /* * 关于item.getName,所以要考虑截取问题! * 怎么办? * 我的思路是找到最后一个\的位置进行截取! * IE下得到的是: * name = C:\Users\Administrator\Desktop\关于编码和解码的问题.txt * 火狐内核中: * name = 关于编码和解码的问题.txt * google内核中: * name = 数据库表—DBUtils案例中.PNG */ if(name.contains("\\")) { name = name.substring(name.lastIndexOf("\\")+1, name.length()); } // 文件大小:单位应该是KB long size = item.getSize(); // 类型 String contentType = item.getContentType(); System.out.println("name = "+name); System.out.println("size = "+size); System.out.println("contentType = "+contentType); /* 输出: * name = 图片.jpg * size = 285900 * contentType = image/jpeg */ // 文件内容 InputStream in = item.getInputStream(); /* 拿到了inputStream之后, * 我们可以自己弄一个FileWriter,FileOutoutStream * 什么的去写文件;也可以使用以下的方法 * * * 使用IO流工具: * 有很多方法,上面提到的那个IO流的jar包 * 其中的FileUtils中的方法。 * * 提供了很多对文件的操作: * copyDirectory * copyFile * copyURLToFile * copyDirectoryToDirectory * copyInputStreamToFile */ // 写出到服务器的硬盘上! 必须要先建e:/files/这个目录! FileUtils.copyInputStreamToFile(in, new File("e:/files/"+name)); /* * 注意: * 在我文件上传完成之后,本地的临时文件 * 不会自动删除,所以要我们手动的进行删除! */ item.delete(); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); doGet(request, response); } }