servlet3.0文件上傳

文件上傳:就是將文件提交到服務器

文件上傳:

瀏覽器端的要求:

1.表單的提交方法必須是post

2.必須有一個文件上傳組件 <input type="file" name="">

3.必須設置表單的enctype=multipart/form-data

服務器端接收的要求:

servlet3.0中

1.需要在Servlet中添加註解

              @multipartConfig (用來支持文件上傳)

2.接收普通上傳組件(除了文件上傳組件):request.getParameter()

3.接收文件上傳組件:request.getPart(name屬性的值);

               getName():獲取的是name屬性的值

4.獲取文件名:

               part.getHeader("content-disposition"):獲取頭信息 然後截取

文件上傳應該注意的問題

名字重複的時候會覆蓋,需要添加隨機名稱

 

 在數據庫中提供兩個字段,

            一個字段用來存放文件的真是名稱

             另一個字段用來存放 文件存放的路徑

隨機名稱:

          uuid

          時間戳

文件安全:

          重要的文件放在 web-inf 或者 meta-inf 或者 服務器創建一個路徑

          不是很重要的文件 放在項目下

文件存放目錄

          方式1:按照日期

         方式2:按照用戶,給每個用戶創建一個文件夾來存放東西

         方式3:按照文件個數

         方式4:隨機目錄

代碼:

瀏覽器端:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/webDay1701/upload2" method="post" enctype="multipart/form-data">
		用戶名:<input name = "username"><br>
		文件:<input type="file" name="f"><br>
		<input type="submit">
	</form>
</body>
</html>

生成隨機名稱的工具類 

package com.itheima.utils;

import java.util.UUID;

public class UploadUtils {
	/**
	 * 獲取隨機名稱
	 * @param realName 真實名稱
	 * @return uuid
	 */
	public static String getUUIDName(String realName){
		//realname  可能是  1.jpg   也可能是  1
		//獲取後綴名
		int index = realName.lastIndexOf(".");
		if(index==-1){
			return UUID.randomUUID().toString().replace("-", "").toUpperCase();
		}else{
			return UUID.randomUUID().toString().replace("-", "").toUpperCase()+realName.substring(index);
		}
		//return null;
	}
	
	/**
	 * 獲取文件真實名稱
	 * @param name
	 * @return
	 */
	public static String getRealName(String name){
		// c:/upload/1.jpg    1.jpg
		//獲取最後一個"/"
		int index = name.lastIndexOf("\\");
		return name.substring(index+1);
	}
	
	/**
	 * 獲取文件目錄
	 * @param name 文件名稱
	 * @return 目錄
	 */
	public static String getDir(String name){
		int i = name.hashCode();
		String hex = Integer.toHexString(i);
		int j=hex.length();
		for(int k=0;k<8-j;k++){
			hex="0"+hex;
		}
	//	System.out.println(hex);
		return "/"+hex.charAt(0)+"/"+hex.charAt(1);
	}
	
	public static void main(String[] args) {
		String s="0";
		String s1="1.jpg";
		//System.out.println(getUUIDName(s));
		//System.out.println(getUUIDName(s1));
		//System.out.println(getRealName(s));
		//System.out.println(getRealName(s1));
		System.out.println(getDir(s));
		System.out.println(getDir(s1));
		//getDir(s);
		//getDir(s1);
	}
}

servlet實現 

package com.itheima.web.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import org.apache.commons.io.IOUtils;

import com.itheima.utils.UploadUtils;

 
@WebServlet("/upload2")
@MultipartConfig
public class Upload2Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//0.設置編碼
		request.setCharacterEncoding("utf-8");
		//獲取普通的上傳組件  username
		String username = request.getParameter("username");
		System.out.println(username);
		
		//獲取文件上傳組件
		Part part = request.getPart("f");
		//獲取文件名稱
		String sss = part.getHeader("content-dispositon");
		String realName = sss.substring(sss.indexOf("filename=")+10, sss.length()-1);
		System.out.println("文件的名稱"+realName);
		
		//獲取隨機名稱
		String uuidName = UploadUtils.getUUIDName(realName);
		System.out.println("文件隨機名稱"+uuidName);
		
		//獲取文件存放的目錄
		String dir = UploadUtils.getDir(uuidName);
		
		String realPath = this.getServletContext().getRealPath("/upload"+dir);
		File file = new File(realPath);
		if(!file.exists())
		{
			file.mkdirs();
		}
		
		System.out.println("文件的目錄"+realPath);
		
		//獲取文件  對拷流
		InputStream is = part.getInputStream();
		FileOutputStream os = new FileOutputStream(new File(file,uuidName));
		
		IOUtils.copy(is,os);
		is.close();
		os.close();
		
		//刪除臨時文件
		part.delete();
	}

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

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章