java文件上傳技巧深刻分析。本站提示廣大學習愛好者:(java文件上傳技巧深刻分析)文章只能為提供參考,不一定能成為您想要的結果。以下是java文件上傳技巧深刻分析正文
本文實例為年夜家分享了java文件上傳技巧,供年夜家參考,詳細內容以下
表單:
客戶端發送HTTP必需應用multipart/form-data數據類型,表現復合數據類型。即:
在表單中應用html標簽。
須要的包:
Commons-fileupload.jar,焦點上傳文件對象都在這個包中。
commons-io.jar – 上傳文件所須要的包
上傳文件類詳解:
DiskFileItemFactory-創立監時文件目次,指是緩存區年夜小
ServletFileUpload用於解析HttpServletRequest。前往一組文件對象。
FileItem – 表現用戶上傳的每個文件對像。
<%@ 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>
<font color="red" size="6">過渡板--懂得底層</font>
<!-- multipart/form-data:多部門(不只有文件,也有部門) -->
<form action="<%=request.getContextPath()%>/upload0" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"/>
<input type="submit" value="上傳"/>
<!-- 上傳的文件名不克不及為中文,不然獲得的文件名是亂碼,不外上面的例子可以處理這個成績 -->
</form>
<br/>
<font color="red" size="6">應用apache文件上傳對象完成文件上傳</font>
<!-- application/x-www-form-urlencoded -->
<form action="<%=request.getContextPath()%>/upload" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"/>
<input type="submit" value="上傳"/>
</form>
<font color="red" size="6">應用apache文件上傳對象完成文件上傳2(處理文件名亂碼)</font>
<p>
POST1(通俗表單):enctype=application/x-www-form-urlencoded(默許值)
</p>
<p>
POST2(上傳文件表單):enctype=multipart/form-data:多部門(不只有文件,也有部門)
</p>
<form action="<%=request.getContextPath()%>/upload2" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"/><!-- POST2(上傳文件表單) --><br/>
文件解釋:<input type="text" name="desc"/><!-- POST1(通俗表單) --><br/><br/>
文件2:<input type="file" name="file"/><br/>
文件解釋2:<input type="text" name="desc"/>
<input type="submit" value="上傳"/>
</form>
<font color="red" size="6">應用apache文件上傳對象完成文件上傳3(文件打散)</font>
<!-- POST1(通俗表單):enctype=application/x-www-form-urlencoded(默許值) -->
<!-- POST2(上傳文件表單):enctype=multipart/form-data:多部門(不只有文件,也有部門) -->
<form action="<%=request.getContextPath()%>/upload3" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file"/><!-- POST2(上傳文件表單) --><br/>
文件解釋:<input type="text" name="desc"/><!-- POST1(通俗表單) --><br/><br/>
文件2:<input type="file" name="file"/><br/>
文件解釋2:<input type="text" name="desc"/>
<input type="submit" value="上傳"/>
</form>
</body>
</html>
過渡板–懂得底層
package cn.hncu.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Upload0Servlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
InputStream in=request.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));
String line;
while((line=br.readLine())!=null){
System.out.println(line);
}
}
}
應用apache文件上傳對象完成文件上傳
package cn.hncu.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.UUID;
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.FileUtils;
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print("不支撐Get方法上傳。。。。。。");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//在辦事器上,為一切上傳文件指定一個寄存目次
String path=getServletContext().getRealPath("/upload");
System.out.println("path:"+path);
File dir=new File(path);
if(!dir.exists()){
dir.mkdirs();
}
//創立一個基於硬盤的工場
//DiskFileItemFactory disk = new DiskFileItemFactory();
//設置暫時目次(建議設計暫時目次,不然會應用體系暫時目次。)
//disk.setRepository(new File(“d:/a”));
//3、 設置向硬盤寫數據的緩沖區年夜小
disk.setSizeThreshold(1024*4);//當文件年夜於此設置時,將會在暫時目次下構成暫時文件
//設置暫時文件緩沖區年夜小--8K緩沖,暫時文件地址
DiskFileItemFactory f=new DiskFileItemFactory(1024*8, new File("d:/a"));
//上傳對象--創立用於解析的對像
ServletFileUpload upload=new ServletFileUpload(f);
upload.setFileSizeMax(1024*1024*5);//設置上傳的單個文件最年夜為5M
//設置上傳文件的最年夜年夜小,假如是多個文件,則為多個文件的和最年夜8M
upload.setSizeMax(1024*1024*8);//設置一切上傳的文件年夜小之和最年夜為8M
//應用解析對象解析
try {
List<FileItem> list=upload.parseRequest(request);
for(FileItem fI:list){
System.out.println("文件內容類型:"+fI.getContentType());//文件內容類型:text/plain
System.out.println("文件名:"+fI.getName());//文件名:C:\Users\adl1\Desktop\a.txt
String ext=fI.getName().substring(fI.getName().lastIndexOf("."));//.txt
String uuid=UUID.randomUUID().toString().replace("-", "");
String fileName=uuid+ext;
// FileUtils.copyInputStreamToFile(fI.getInputStream(), new File("d:/a/d/a.txt"));//寫逝世了
//fI.getInputStream()是真注釋件信息
FileUtils.copyInputStreamToFile(fI.getInputStream(), new File(path+"/"+fileName));//寫活了
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
在這個處所存儲上傳的文件
上傳信息:
上傳成果:
應用apache文件上傳對象完成文件上傳2(處理文件名亂碼)
package cn.hncu.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.UUID;
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.FileUtils;
public class Upload2Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
//假如是含上傳文件的表單(POST2),該劇只能設置所上傳文件的文件名中的編碼(處理他的中文亂碼)
//但不克不及處理在POST2方法下的通俗表單組件的中文亂碼
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print("不支撐Get方法上傳。。。。。。");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//第一步
//通俗的form表單(POST1),上面這句可以設置通俗表單組件內容的編碼(可以或許處理它們的中文亂碼成績)
request.setCharacterEncoding("utf-8");
//假如是含上傳文件的表單(POST2),該句只能設置所上傳文件的文件名中的編碼(處理它的中文亂碼)。但不克不及處理通俗表單組件的亂碼(不克不及設它編碼)
//在辦事器上,為一切上傳文件指定一個寄存目次
String path=getServletContext().getRealPath("/upload");
System.out.println("path:"+path);
File dir=new File(path);
if(!dir.exists()){
dir.mkdirs();
}
//設置暫時文件緩沖區年夜小--8K緩沖,暫時文件地址
DiskFileItemFactory f=new DiskFileItemFactory(1024*8, new File("d:/a"));
//上傳對象
ServletFileUpload upload=new ServletFileUpload(f);
upload.setFileSizeMax(1024*1024*5);//設置上傳的單個文件最年夜為5M
upload.setSizeMax(1024*1024*8);//設置一切上傳的文件年夜小之和最年夜為8M
//應用解析對象解析
try {
List<FileItem> list=upload.parseRequest(request);
for(FileItem fI:list){
if((fI.isFormField())){//假如是通俗表單組件:checkbox,radio,password...
// String desc=fI.getString();
System.out.println("fI.getString():"+fI.getString());
//第二步
String desc=fI.getString("utf-8");
//該句設置通俗表單組件內容編碼
System.out.println("編碼後:"+desc);
}else{
String ext=fI.getName().substring(fI.getName().lastIndexOf("."));//.txt
String uuid=UUID.randomUUID().toString().replace("-", "");
String fileName=uuid+ext;
//fI.getInputStream()是真注釋件信息
FileUtils.copyInputStreamToFile(fI.getInputStream(), new File(path+"/"+fileName));//寫活了
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
上傳信息:
上傳成果:
應用apache文件上傳對象完成文件上傳3(文件打散)
用Hash目次優化文件存儲:
Hash目次是一種優化文件存儲機能的辦法。不管是Windows照樣Linux,不管是NTFS照樣ext3,每一個目次下所能包容的項目數是無限的。
其實不是不克不及保留,而是當項目數目過年夜的時刻,會下降文件索引速度,
所以衡量一個目次下應當保留若干文件是很需要的。保留很多了會影響機能,保留得少了會形成目次太多和空間糟蹋。所以當保留年夜批文件的時刻,
須要有一種算法能將文件比擬平均地“打散”在分歧的子目次下以進步每級的索引速度,這類算法就是 Hash。平日用的MD5、sha1等都可以用來做Hash目次,我的Session裡也異樣應用了MD5,獲得sessionID的第一名和第九位,這就組成了兩級Hash途徑,也就是說,體系把一切的Session文件疏散到了16×16=256個子目次下。假定Linux每一個目次下保留1000個文件可以取得最好的空間機能比,那末體系在幻想情形下可以同時有256000個session文件在被應用。
package cn.hncu.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.UUID;
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.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
public class Upload3Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
//假如是含上傳文件的表單(POST2),該劇只能設置所上傳文件的文件名中的編碼(處理他的中文亂碼)
//但不克不及處理在POST2方法下的通俗表單組件的中文亂碼
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
//獲得GET方法的url中“?”號前面的部門
//http://localhost:8080/servletDemo3/upload?name=Jack&sex=male
String qStr = request.getQueryString();
System.out.println("qStr: "+qStr);//qStr: name=Jack&sex=male
out.print("不支撐Get方法上傳。。。。。。");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//1防黑: 防護前端采取POST1方法提交
//法1
/*
String type=request.getContentType();
if(!type.contains("multipart/form-data")){
out.println("不支撐通俗表單提交");
return;
}*/
//法2
boolean boo = ServletFileUpload.isMultipartContent(request);
if(!boo){
out.println("不支撐通俗表單提交");
return;
}
//第一步
//通俗的form表單(POST1),上面這句可以設置通俗表單組件內容的編碼(可以或許處理它們的中文亂碼成績)
request.setCharacterEncoding("utf-8");
//假如是含上傳文件的表單(POST2),該句只能設置所上傳文件的文件名中的編碼(處理它的中文亂碼)。但不克不及處理通俗表單組件的亂碼(不克不及設它編碼)
//在辦事器上,為一切上傳文件指定一個寄存目次
String path=getServletContext().getRealPath("/upload");
System.out.println("path:"+path);
File dir=new File(path);
if(!dir.exists()){
dir.mkdirs();
}
//設置暫時文件緩沖區年夜小--8K緩沖,暫時文件地址
DiskFileItemFactory f=new DiskFileItemFactory(1024*8, new File("d:/a"));
//上傳對象
ServletFileUpload upload=new ServletFileUpload(f);
upload.setFileSizeMax(1024*1024*5);//設置上傳的單個文件最年夜為5M
upload.setSizeMax(1024*1024*8);//設置一切上傳的文件年夜小之和最年夜為8M
//▲4上傳進度監聽
upload.setProgressListener(new ProgressListener(){
private double pre=0D;
@Override//參數1:已上傳若干字節 參數2:一共若干字節 參數3:第幾個文件(序號從1開端)
public void update(long pByteRead, long pContentLength, int pItems) {
double d = 1.0*pByteRead/pContentLength*100;
System.out.println(d+"%");
if(pre!=d){
System.out.println(d+"%");
pre=d;
}
}
});
//應用解析對象解析
try {
List<FileItem> list=upload.parseRequest(request);
for(FileItem fI:list){
if((fI.isFormField())){//假如是通俗表單組件:checkbox,radio,password...
// String desc=fI.getString();
System.out.println("fI.getString():"+fI.getString());
//第二步
String desc=fI.getString("utf-8");
//該句設置通俗表單組件內容編碼
System.out.println("編碼後:"+desc);
}else{
//防護:過濾失落沒選擇文件的空文件組件
if(fI.getSize()<=0){
continue;//讀下一個文件
}
System.out.println("文件內容類型:"+fI.getContentType());//文件內容類型:text/plain
System.out.println("文件名:"+fI.getName());//文件名:C:\Users\adl1\Desktop\a.txt
String ext=fI.getName().substring(fI.getName().lastIndexOf("."));//.txt
String uuid=UUID.randomUUID().toString().replace("-", "");
String fileName=uuid+ext;
//文件目次打散技巧
String dir1=Integer.toHexString(uuid.hashCode()&0x0f);
String dir2=Integer.toHexString((uuid.hashCode()&0xf0)>>4);
//fI.getInputStream()是真注釋件信息
FileUtils.copyInputStreamToFile(fI.getInputStream(), new File(path+"/"+dir1+"/"+dir2+"/"+fileName));//寫活了
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
打散信息:
打散成果:
文件1:
文件2:
演示上傳進度道理
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。