知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁(yè) » 新聞資訊 » 網(wǎng)站建設(shè) >
Java web開(kāi)發(fā)——文件的上傳和下載
發(fā)表時(shí)間:2018-7-28
發(fā)布人:葵宇科技
瀏覽次數(shù):55
打個(gè)廣告,幫朋友賣點(diǎn)東西,東西超便宜的喲【衣服鞋子等】,廠家直接出貨,絕對(duì)低于市場(chǎng)價(jià)!!! 一般都比市場(chǎng)價(jià)便宜3—7折【都是牌子貨】,如果您感興趣,可以掃描屏幕下方的二維碼,感謝關(guān)注!!!

一、文件上傳
1、概述
實(shí)現(xiàn)web開(kāi)發(fā)中的文件上傳功能,需完成如下二步操作:
- 在web頁(yè)面中添加上傳輸入項(xiàng)
- 在servlet中讀取上傳文件的數(shù)據(jù),并保存到本地硬盤(pán)中。
2、在web頁(yè)面中
在web頁(yè)面中通過(guò)<input type=“file”>標(biāo)簽添加上傳輸入項(xiàng),設(shè)置文件上傳輸入項(xiàng)時(shí)須注意:
1、必須要設(shè)置input輸入項(xiàng)的name屬性,否則瀏覽器將不會(huì)發(fā)送上傳文件的數(shù)據(jù)。
2、必須把form的enctype屬值設(shè)為multipart/form-data.設(shè)置該值后,瀏覽器在上傳文件時(shí),將把文件數(shù)據(jù)附帶在http請(qǐng)求消息體中,并使用MIME協(xié)議對(duì)上傳的文件進(jìn)行描述,以方便接收方對(duì)上傳數(shù)據(jù)進(jìn)行解析和處理。
<form action="${pageContext.request.contextPath }/servlet/UploadServlet3" enctype="multipart/form-data" method="post">
上傳用戶:<input type="text" name="username"><br/>
上傳文件1:<input type="file" name="file1"><br/>
上傳文件2:<input type="file" name="file2"><br/>
<input type="submit" value="提交">
</form>
注意:如果要?jiǎng)討B(tài)添加上傳輸入項(xiàng)可以:
<html>
<head>
<title>My JSP 'upload2.jsp' starting page</title>
<script type="text/javascript">
function addinput(){
var div = document.getElementById("file");
var input = document.createElement("input");
input.type="file";
input.name="filename";
var del = document.createElement("input");
del.type="button";
del.value="刪除";
del.onclick = function d(){
this.parentNode.parentNode.removeChild(this.parentNode);
}
var innerdiv = document.createElement("div");
innerdiv.appendChild(input);
innerdiv.appendChild(del);
div.appendChild(innerdiv);
}
</script>
</head>
<body>
<form action="" enctype="mutlipart/form-data"></form>
<table>
<tr>
<td>上傳用戶:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>上傳文件:</td>
<td>
<input type="button" value="添加上傳文件" class="has" src="https://img-blog.csdn.net/20180728200740972?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIyMTcyMTMz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" />
3、在Servlet中
1.基本介紹
在Servlet中通過(guò)開(kāi)源組件( Commons-fileupload )讀取文件上傳數(shù)據(jù),并保存到本地硬盤(pán)中。使用Commons-fileupload組件實(shí)現(xiàn)文件上傳,需要導(dǎo)入該組件相應(yīng)的支撐jar包:
Commons-fileupload和commons-io
注意:如果表單的提交類型為multipart/form-data的話,在servlet方就不能采用傳統(tǒng)方式獲取表單數(shù)據(jù)
String username = request.getParameter("username");
System.out.println(username);
2.相關(guān)方法
1.DiskFileItemFactory
DiskFileItemFactory 是創(chuàng)建 FileItem 對(duì)象的工廠,這個(gè)工廠類常用方法:
方法介紹public void setSizeThreshold(int sizeThreshold) 設(shè)置內(nèi)存緩沖區(qū)的大小,默認(rèn)值為10K。當(dāng)上傳文件大于緩沖區(qū)大小時(shí), fileupload組件將使用臨時(shí)文件緩存上傳文件。public void setRepository(java.io.File repository) 指定臨時(shí)文件目錄,默認(rèn)值為System.getProperty("java.io.tmpdir").public DiskFileItemFactory(int sizeThreshold, java.io.File repository) 構(gòu)造函數(shù)
2.ServletFileUpload
負(fù)責(zé)處理上傳的文件數(shù)據(jù),并將表單中每個(gè)輸入項(xiàng)封裝成一個(gè) FileItem 對(duì)象中。常用方法有:
方法介紹boolean isMultipartContent(HttpServletRequest request) 判斷上傳表單是否為multipart/form-data類型List parseRequest(HttpServletRequest request)解析request對(duì)象,并把表單中的每一個(gè)輸入項(xiàng)包裝成一個(gè)fileItem 對(duì)象,并返回一個(gè)保存了所有FileItem的list集合。setFileSizeMax(long fileSizeMax) 設(shè)置上傳文件的最大值setSizeMax(long sizeMax) 設(shè)置上傳文件總量的最大值setHeaderEncoding(java.lang.String encoding) 設(shè)置編碼格式setProgressListener(ProgressListener pListener) 上傳監(jiān)聽(tīng)器,可以知道文件上傳進(jìn)度
3.servlet實(shí)現(xiàn)
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
?
public class UploadServlet2 extends HttpServlet {
?
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
//1.得到解析器工廠
DiskFileItemFactory factory = new DiskFileItemFactory();
//設(shè)置緩存文件路徑(臨時(shí)文件)
factory.setRepository(new File(this.getServletContext().getRealPath("/WEB-INF/temp")));
//2.得到解析器
ServletFileUpload upload = new ServletFileUpload(factory);
?
upload.setHeaderEncoding("UTF-8"); //解決上傳文件名的中文亂碼
//3.判斷上傳表單的類型
if(!upload.isMultipartContent(request)){
//上傳表單為普通表單,則按照傳統(tǒng)方式獲取數(shù)據(jù)即可
return;
}
//為上傳表單,則調(diào)用解析器解析上傳數(shù)據(jù)
List<FileItem> list = upload.parseRequest(request); //FileItem
//遍歷list,得到用于封裝第一個(gè)上傳輸入項(xiàng)數(shù)據(jù)fileItem對(duì)象
for(FileItem item : list){
if(item.isFormField()){
//得到的是普通輸入項(xiàng)
String name = item.getFieldName(); //得到輸入項(xiàng)的名稱
String value = item.getString("UTF-8");//或者String value = item.getString();加下
//value = new String(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name + "=" + value);
}else{
//得到上傳輸入項(xiàng)
String filename = item.getName(); //得到上傳文件名 C:\Documents and Settings\ThinkPad\桌面\1.txt(有些瀏覽器)||1.txt
if(filename==null || filename.trim().equals("")){//如果上傳輸入框?yàn)榭?#xff0c;跳出
continue;
}
filename = filename.substring(filename.lastIndexOf("\\")+1);
InputStream in = item.getInputStream(); //得到上傳數(shù)據(jù)
int len = 0;
byte buffer[]= new byte[1024];
String savepath = this.getServletContext().getRealPath("/upload");
FileOutputStream out = new FileOutputStream(savepath + "\\" + filename); //向upload目錄中寫(xiě)入文件
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();
item.delete();//刪除臨時(shí)文件
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
?
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
?
doGet(request, response);
}
?
}
注意:
1.上傳的文件一般禁止別人訪問(wèn),故可以放在WEB-INF目錄下
//用于保存上傳文件的目錄應(yīng)該禁止外界直接訪問(wèn)
String savepath = this.getServletContext().getRealPath("/WEB-INF/upload");
System.out.println(savepath);
2.為了防止上傳名稱相同的文件,可以使用UUID
String savepath = this.getServletContext().getRealPath("/upload");
String saveFilename = makeFileName(filename); //得到文件保存的名稱
FileOutputStream out = new FileOutputStream(savepath + "\\" + saveFilename); //向upload目錄中寫(xiě)入文件
。。。。。。。。。。。。。。。
?
public String makeFileName(String filename){ //2.jpg
return UUID.randomUUID().toString() + "_" + filename;
}
3.防止一個(gè)文件夾下的文件太多(文件夾下文件過(guò)多,將導(dǎo)致打開(kāi)緩慢)
String savepath = this.getServletContext().getRealPath("/upload");
String realSavePath = makePath(filename, savePath); //得到文件的保存目錄
FileOutputStream out = new FileOutputStream(realSavePath + "\\" + filename);
?
public String makePath(String filename,String savePath){//文件的存放位置是根據(jù)文件名算出的,以后再下載的時(shí)候可以根據(jù)計(jì)算結(jié)果來(lái)確定文件存放的地址
int hashcode = filename.hashCode();//拿到filename的地址
int dir1 = hashcode&0xf; //0--15,拿到低四位當(dāng)一級(jí)目錄
int dir2 = (hashcode&0xf0)>>4; //0-15,5到8位當(dāng)二級(jí)目錄
String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
File file = new File(dir);
if(!file.exists()){//如果這個(gè)目錄不存在,創(chuàng)建
file.mkdirs();
}
return dir;
}
4.限制上傳文件的大小
upload.setFileSizeMax(1024);//單個(gè)文件不能超過(guò)1k
upload.setSizeMax(1024*10);//總共不能超過(guò)10k
List<FileItem> list = upload.parseRequest(request);
for(FileItem item : list){
?
?
}catch (FileUploadBase.FileSizeLimitExceededException e) {
e.printStackTrace();
request.setAttribute("message", "文件超出最大值!!!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
5.監(jiān)聽(tīng)文件上傳進(jìn)度
//2.得到解析器
ServletFileUpload upload = new ServletFileUpload(factory);
?
upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int arg2) {
System.out.println("文件大小為:" + pContentLength + ",當(dāng)前已處理:" + pBytesRead);
}
});
?
upload.setHeaderEncoding("UTF-8"); //解決上傳文件名的中文亂碼
二、文件下載
文件下載列表:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
?
<c:forEach var="me" items="${map}">
<c:url value="/servlet/DownLoadServlet" var="downurl">
<c:param name="filename" value="${me.key}"></c:param>
</c:url>
${me.value } <a href="${downurl}">下載</a> <br/>
</c:forEach>
</body>
</html>
查找所有文件:
//列出網(wǎng)站所有下載文件
public class ListFileServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filepath = this.getServletContext().getRealPath("/WEB-INF/upload");
Map map = new HashMap();
listfile(new File(filepath),map);
request.setAttribute("map", map);
request.getRequestDispatcher("/listfile.jsp").forward(request, response);
}
public void listfile(File file,Map map){
if(!file.isFile()){//如果不是文件,是文件夾
File files[] = file.listFiles();
for(File f : files){
listfile(f,map);
}
}else{
String realname = file.getName().substring(file.getName().indexOf("_")+1); //9349249849-88343-8344_阿_凡_達(dá).avi
map.put(file.getName(), realname);//UUID,文件名
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
通過(guò)傳過(guò)來(lái)的參數(shù)(文件名的UUID)來(lái)算出文件所在文件夾,并將其取出
public class DownLoadServlet extends HttpServlet {
?
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
?
String filename = request.getParameter("filename"); //23239283-92489-阿凡達(dá).avi
filename = new String(filename.getBytes("iso8859-1"),"UTF-8");
String path = makePath(filename,this.getServletContext().getRealPath("/WEB-INF/upload"));
File file = new File(path + "\\" + filename);
if(!file.exists()){
request.setAttribute("message", "您要下載的資源已被刪除!!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
String realname = filename.substring(filename.indexOf("_")+1);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
FileInputStream in = new FileInputStream(path + "\\" + filename);
OutputStream out = response.getOutputStream();
byte buffer[] = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();
}
public String makePath(String filename,String savePath){
int hashcode = filename.hashCode();
相關(guān)案例查看更多
相關(guān)閱讀
- 網(wǎng)站建設(shè)方案 doc
- 云南小程序代建
- 網(wǎng)站沒(méi)排名
- 小程序被騙退款成功
- 網(wǎng)站建設(shè)服務(wù)公司
- 網(wǎng)站建設(shè)服務(wù)
- 云南網(wǎng)站建設(shè)專業(yè)品牌
- 昆明網(wǎng)站制作
- 高端網(wǎng)站建設(shè)公司
- 汽車回收系統(tǒng)
- 報(bào)廢車回收管理系統(tǒng)
- 云南網(wǎng)站建設(shè)公司
- 云南網(wǎng)站建設(shè)專家
- 網(wǎng)絡(luò)公司排名
- 保山小程序開(kāi)發(fā)
- 云南建設(shè)廳官方網(wǎng)站
- 文山小程序開(kāi)發(fā)
- flex
- 軟件定制公司
- 開(kāi)發(fā)框架
- 昆明網(wǎng)絡(luò)公司
- 云南花農(nóng)小程序
- 云南網(wǎng)站建設(shè)列表網(wǎng)
- 報(bào)廢車拆解管理系統(tǒng)
- 定制小程序開(kāi)發(fā)
- 網(wǎng)站建設(shè)方法
- 小程序生成海報(bào)
- python開(kāi)發(fā)小程序
- 支付寶小程序被騙
- 云南省建設(shè)廳官方網(wǎng)站