zoukankan      html  css  js  c++  java
  • 模拟文件上传(二):使用apache fileupload组件进行文件上传

    其中涉及到的jar包:

    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:	emp 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:UsersAdministratorDesktop关于编码和解码的问题.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);
    	}
    
    }
    

  • 相关阅读:
    Docker容器进入的4种方式
    Linux启动/停止/重启Mysql数据库的方法
    MySQL replace函数替换字符串语句的用法(mysql字符串替换)
    php从数组中随机筛选出指定个数的值
    Beyond Compare 4 30天试用期后,破解方法
    MYSQL:1213 Deadlock问题排查历程
    uniapp 屏幕高度
    如何系统学习Spring框架
    mysql 批量修改表前缀
    DHCP中继配置案例
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053459.html
Copyright © 2011-2022 走看看