zoukankan      html  css  js  c++  java
  • Servlet实现文件上传

    一.组件准备

             Servlet实现文件上传,需要添加第三方提供的jar包
             commons-fileupload-1.2.2-bin.zip 
             commons-io-2.3-bin.zip    
            在
    http://commons.apache.org/downloads/index.html找,然后放在如下目录下

             image

            文件上传的表单提交方式必须是POST方式,
             编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded

    文件上传
      具体步骤:
    * 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包
    * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同
    * 3)对 DiskFileItemFactory 对象设置一些 属性
    * 4)高水平的API文件上传处理  ServletFileUpload upload = new ServletFileUpload(factory); 目的是调用 parseRequest(request)方法  获得 FileItem 集合list (一次上传多个文件,意思是多个input file)
    * 5)在 FileItem 对象中 获取信息,   遍历, 判断 表单提交过来的信息 是否是 普通文本信息  另做处理
    * 6)
    *    第一种. 用第三方 提供的  item.write( new File(path,filename) );  直接写到磁盘上
    *    第二种. 手动处理  

    二.理论准备

              base标签只能放置在head标签内,只有href和target,所有浏览器都支持head标签,里面的title是唯一必须的。<base> 标签为页面上的所有链接规定默认地址或默认目标。通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白。使用 <base> 标签可以改变这一点。浏览器随后将不再使用当前文档的 URL,而使用指定的基本 URL 来解析所有的相对 URL。这其中包括 <a>、<img>、<link>、<form> 标签中的 URL。

    <html>
    
    <head>
    
    <base href="http://www.w3school.com.cn/i/" />
    
    <base target="_blank" />
    
    </head>
    
    <body>
    
    <img src="eg_smile.gif" /><br />
    
    <p>请注意,我们已经为图像规定了一个相对地址。由于我们已经在 head 部分规定了一个基准 URL,浏览器将在如下地址寻找图片:</p>
    
    <p>"http://www.w3school.com.cn/i/eg_smile.gif"</p>
    
    <br /><br />
    
    <p><a href="http://www.w3school.com.cn">W3School</a></p>
    
    <p>请注意,链接会在新窗口中打开,即使链接中没有 target="_blank" 属性。这是因为 base 元素的 target 属性已经被设置为 "_blank" 了。</p>
    
    </body>
    
    </html>
    

    三.代码实现

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    
    	pageEncoding="UTF-8"%>
    
    <%  
    
    	//得到项目的名字,如果项目为根目录,则得到一个"",即空的字条串
    
    	String path = request.getContextPath();  
    
    	//scheme:http
    
    	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    
    %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <html>
    
    <head>
    
    <!--  
    
    所有浏览器都支持head标签,里面的title是唯一必须的。
    
     <base> 标签为页面上的所有链接规定默认地址或默认目标。
    
    通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白。
    
    使用 <base> 标签可以改变这一点。浏览器随后将不再使用当前文档的 URL,而使用指定的基本 URL 来解析所有的相对 URL。
    
    这其中包括 <a>、<img>、<link>、<form> 标签中的 URL。
    
     -->
    
    	<base href="<%=basePath%>">
    
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    	<title>文件上传</title>
    
    </head>
    
    <body>
    
    	<form action="2.jsp" method="post" enctype="multipart/form-data">
    
    		<label>文件:<input type="file" name="myFile">
    
    		</label><br /> <label>其他信息:<input type="text" name="info" /></label><br /> <input
    
    			type="submit" value="提交" />
    
    	</form>
    
    </body>
    
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    
        pageEncoding="UTF-8"%>
    
    <%@page import="org.apache.commons.fileupload.servlet.*" %>
    
    <%@page import="org.apache.commons.fileupload.*" %>
    
    <%@page import="org.apache.commons.fileupload.disk.*" %>
    
    <%@page import="java.util.List" %>
    
    <%@page import="java.util.Iterator" %>
    
    <%@page import="java.io.*" %>
    
    <%
    
    	//Check that we have a file upload request
    
    	//监测request中是否包含文件
    
    	boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    
    	if(isMultipart){
    
    		out.print("包含文件");
    
    	}else{
    
    		out.print("不包含文件");
    
    	}
    
    	out.print("<br/>");
    
    	
    
    	// Create a factory for disk-based file items
    
    	FileItemFactory factory = new DiskFileItemFactory();
    
    	//获取文件需要上传到的路径  
    
       // String path = request.getRealPath("/upload");  
    
        String path = session.getServletContext().getRealPath("upload");
    
    	 //如果没以下两行设置的话,上传大的 文件 会占用 很多内存,  
    
        //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同  
    
        /** 
    
         * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,  
    
         * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的  
    
         * 然后再将其真正写到 对应目录的硬盘上 
    
         */  
    
       // factory.setRepository(new File(path));
    
        //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室  
    
       // factory.setSizeThreshold(1024*1024) ;  
    
    	// Create a new file upload handler
    
    	ServletFileUpload upload = new ServletFileUpload(factory);
    
    	// Parse the request
    
    	List  items = upload.parseRequest(request);
    
    	
    
    	// Process the uploaded items
    
    	Iterator iter = items.iterator();
    
    	while (iter.hasNext()) {
    
    	    FileItem item = (FileItem) iter.next();
    
    	    if (item.isFormField()) {//如果是普通表单控件
    
    	    	////获取表单的属性名字  
    
    	    	String name = item.getFieldName();
    
    	    	//获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的  
    
    	        String value = item.getString();
    
    	    	
    
    	    	request.setAttribute(name,value);
    
    	    	
    
    			out.print("name:"+name +"<br/>");
    
    			out.print("value:"+value +"<br/>");
    
    			
    
    	    } else {//如果是文件
    
    	    	
    
    	    	//也叫name是为了和上面保持一致,方便显示页面
    
    	    	String name = item.getFieldName();
    
    	        String fileName = item.getName();
    
    	        String contentType = item.getContentType();
    
    	        boolean isInMemory = item.isInMemory();
    
    	        long sizeInBytes = item.getSize();
    
    	        
    
    	        out.print("表单文件控件名:"+name +"<br/>");
    
    	        //绝对路径的
    
    	        out.print("上传文件名:"+fileName +"<br/>");
    
    	        out.print("文件类型:"+contentType +"<br/>");
    
    	        out.print("是否保存在内存中:"+isInMemory +"<br/>");
    
    	        out.print("大小:"+sizeInBytes +"字节<br/>");
    
    	        
    
    	        //上传文件
    
    	        //获取文件名
    
    	        String f_name = fileName.substring(fileName.lastIndexOf("\")+1,fileName.length());
    
    	        
    
    	        request.setAttribute(name,f_name);
    
    	     	// 进行文件上传   
    
                File uploadedFile = new File(path ,f_name);
    
                item.write(uploadedFile);
    
                /* OutputStream out = new FileOutputStream(new File(path,filename));  
    
                
    
                InputStream in = item.getInputStream() ;  
    
              
    
                int length = 0 ;  
    
                byte [] buf = new byte[1024] ;  
    
                System.out.println("获取上传文件的总共的容量:"+item.getSize());  
    
                // in.read(buf) 每次读到的数据存放在   buf 数组中  
    
                while( (length = in.read(buf) ) != -1)  
    
                {  
    
                    //在   buf 数组中 取出数据 写到 (输出流)磁盘上  
    
                    out.write(buf, 0, length);  
    
                }  
    
                in.close();  
    
                 */
    
    	    }
    
    	}
    
    	request.getRequestDispatcher("showFile.jsp").forward(request, response);  
    
    %>
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    <%
    
    	String path = request.getContextPath();
    
    	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    
    <html>
    
      <head>
    
        <base href="<%=basePath%>">
    
        
    
        <title>文件展示</title>
    
        
    
    	<meta http-equiv="pragma" content="no-cache">
    
    	<meta http-equiv="cache-control" content="no-cache">
    
    	<meta http-equiv="expires" content="0">    
    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    
    	<meta http-equiv="description" content="This is my page">
    
    	<!--
    
    	<link rel="stylesheet" type="text/css" href="styles.css">
    
    	-->
    
      </head>
    
      
    
      <body>
    
        
    
        用户名:${requestScope.usename } <br/>
    
        文件:${requestScope.myfile }<br/>
    
        <!-- 把上传的图片显示出来 -->
    
        <img alt="go" src="upload/<%=(String)request.getAttribute("myfile")%> " />
    
        
    
      </body>
    
    </html>
    
              如果有不足或者错误的地方,还请指出,不胜感激,愿你我共同进步。。。。

  • 相关阅读:
    Note/Solution 转置原理 & 多点求值
    Note/Solution 「洛谷 P5158」「模板」多项式快速插值
    Solution 「CTS 2019」「洛谷 P5404」氪金手游
    Solution 「CEOI 2017」「洛谷 P4654」Mousetrap
    Solution Set Border Theory
    Solution Set Stirling 数相关杂题
    Solution 「CEOI 2006」「洛谷 P5974」ANTENNA
    Solution 「ZJOI 2013」「洛谷 P3337」防守战线
    Solution 「CF 923E」Perpetual Subtraction
    KVM虚拟化
  • 原文地址:https://www.cnblogs.com/hxsyl/p/3432810.html
Copyright © 2011-2022 走看看