基於servlet完成文件上傳功能_方式一【原始手寫流開發版】


本次文件依靠第三方組件(Apache)進行實現

commons-fileupload組件:

下載jar包:

commons-fileupload.jar

jar包下載地址:
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
操作指南:
http://commons.apache.org/proper/commons-fileupload/using.html

commons-io.jar

jar包下載地址:
http://commons.apache.org/proper/commons-io/download_io.cgi
操作指南:
http://commons.apache.org/proper/commons-io/description.html

文件上傳的前提

1.form表單的method必須是post
2.form表單的組件得是file屬性:比如:<input type="file" name="photoName" >
3.form表單的enctype必須是multipart/form-data 以二進制字節流進行提交 傳統接收參數的方式無效

代碼演示

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
  <head>
    <title>MrYang Design File Upload</title>
  </head>
  
  <body>
   	<form action="${pageContext.request.contextPath}/servlet/UploadServlet" enctype="multipart/form-data" method="post" >
   		名稱<input type="text" name="name" ><br/><br/>
   		密碼<input type="text" name="pwd" ><br/><br/>
   		<input type="file" name="photoName" ><br/><br/>
		<input type="submit" value="上傳" >
   	</form>
  </body>
</html>

  2.servlet中進行接受並且進行上傳處理

  

package cn.javabs.web.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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.FilenameUtils;

public class UploadServlet extends HttpServlet {

	@SuppressWarnings("unchecked")
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		/**
		 * Set CharEncoding
		 */
		response.setContentType("text/html ;charset = utf-8 ");
		response.setCharacterEncoding("utf-8");
		request.setCharacterEncoding("utf-8");

		String name = request.getParameter("photoName");

		//  1. 用於判斷jsp表單中的enctype 的屬性值是不是multipart/form-data
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		// 如果不是multipart/form-data 則提醒
		if (!isMultipart) {
			response.getWriter().write("提交的不是multipart/form-data");
			return;
		}
		//實例化 磁盤文件項工廠對象  
		DiskFileItemFactory factory = new DiskFileItemFactory();

		//ServletFileUpload是用於解析request對象
		ServletFileUpload upload = new ServletFileUpload(factory);

		List<FileItem> items = null;

		try {
		//	通過ServletFileUpload得到所有上傳項.每一個FileItem就相當於一個上傳項
			items = upload.parseRequest(request);
		} catch (FileUploadException e) {
			throw new RuntimeException(e);
		}
		System.out.println("我們來一起看一下items是:" + items);
		// 循環取出所有的組件  其中組件包含有  普通組件 和  上傳組件
		for (FileItem item : items) {
		//	通過判斷確定 item中的普通組件   使用的判斷方法是isFormField 
			// 是普通的表單字段
			if(item.isFormField()){
				System.out.println("這是普通的表單字段");
				// 獲取表單中的屬性  
				String fieldName = item.getFieldName();
				// 獲取表單中的屬性所對應的值  
				String fieldValue = item.getString();
				
				System.out.println(fieldName +":" + fieldValue);
			}	
			// 是上傳的表單字段
			else{
				System.out.println("這是上傳的表單字段");
				// 獲取字節輸入流
				InputStream in = item.getInputStream();
				
				// 獲取上傳文件的名稱
				String uploadName = item.getName();
				
				// 判斷上傳文件的名稱是否為null,如果不為空
				if(uploadName != null){
					// 文件名稱     =		 獲取文件名稱,並且包含后綴
					uploadName = FilenameUtils.getName(uploadName);
				}
				
				// 文件存放的真實路徑	 其實files文件夾 存放在Tomcat服務器的項目里面
				String filePath = getServletContext().getRealPath("/files");
				
				// 根據真實的路徑 進行實例化創建目錄
				File file = new File(filePath);
				
				// 如果目錄不存在
				if(!file.exists()){
					//創建多級目錄
					file.mkdirs();
				}
				// 根據  真實目錄  + "\" + 文件名稱  [file.separator 的結果是 "\"]
				OutputStream out = new FileOutputStream(filePath +  file.separator + uploadName );
				
				// 定義長度  初始化值為0
				int len = 0;
				
				//定義字節緩沖區數組
				byte [] b = new byte[1024];
				
				// 循環
				while ((len = in.read(b))!=-1) {
					out.write(b, 0, len);
				}
				// 關閉輸出流
				out.close();
				// 關閉輸入流
				in.close();
				// 刪除臨時文件
				item.delete();
			}
		}

	}

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

		this.doGet(request, response);

	}

}

  

  別忘了還有web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>cn.javabs.web.controller.UploadServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/servlet/UploadServlet</url-pattern>
  </servlet-mapping>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM