文件上傳:就是將文件提交到服務器
文件上傳:
瀏覽器端的要求:
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);
}
}