知è˜(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è) >
JavaWeb之文件上傳與下載詳解
發(fÄ)表時(shÃ)間:2017-3-15
發(fÄ)布人:葵宇科技
ç€è¦½æ¬¡æ•¸(shù):48
文件上傳
文件上傳概述
實(shÃ)ç¾(xià n)webé–‹(kÄi)發(fÄ)ä¸çš„æ–‡ä»¶ä¸Šå‚³åŠŸèƒ½,需完æˆå¦‚ä¸‹äºŒæ¥æ“作:
(1)在webé (yè)é¢ä¸æ·»åŠ ä¸Šå‚³è¼¸å…¥é …(xià ng);
(2)在servletä¸è®€å–上傳文件的數(shù)據(jù),å¹¶ä¿å˜åˆ°æœ¬åœ°ç¡¬ç›¤ä¸ã€‚如何在webé (yè)é¢ä¸æ·»åŠ ä¸Šå‚³è¼¸å…¥é …(xià ng)?<input type=â€fileâ€>標(biÄo)簽用于在webé (yè)é¢ä¸æ·»åŠ æ–‡ä»¶ä¸Šå‚³è¼¸å…¥é …(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)行解æžå’Œè™•ç†ã€‚如何在Servletä¸è®€å–文件上傳數(shù)據(jù),å¹¶ä¿å˜åˆ°æœ¬åœ°ç¡¬ç›¤ä¸?
(1)Requestå°(duì)象æä¾›äº†ä¸€å€‹(gè)getInputStream方法,通éŽ(guò)這個(gè)方法å¯ä»¥è®€å–到客戶端æäº¤éŽ(guò)來(lái)的數(shù)據(jù)。但由于用戶å¯èƒ½æœƒ(huì)åŒæ™‚(shÃ)上傳多個(gè)文件,在servlet端編程直接讀å–上傳數(shù)據(jù),并分別解æžå‡ºç›¸æ‡‰(yÄ«ng)的文件數(shù)據(jù)æ˜¯ä¸€é …(xià ng)éžå¸¸éº»ç…©çš„工作;
(2)ç‚ºæ–¹ä¾¿ç”¨æˆ¶è™•ç†æ–‡ä»¶ä¸Šå‚³æ•¸(shù)據(jù),Apache é–‹(kÄi)æºçµ„ç¹”æä¾›äº†ä¸€å€‹(gè)用來(lái)處ç†è¡¨å–®æ–‡ä»¶ä¸Šå‚³çš„一個(gè)é–‹(kÄi)æºçµ„ä»¶( Commons-fileupload ),該組件性能優(yÅu)ç•°,并且其API使用極其簡(jiÇŽn)å–®,å¯ä»¥è®“é–‹(kÄi)發(fÄ)人員輕æ¾å¯¦(shÃ)ç¾(xià n)web文件上傳功能,å› æ¤åœ¨webé–‹(kÄi)發(fÄ)ä¸å¯¦(shÃ)ç¾(xià n)文件上傳功能,通常使用Commons-fileupload組件實(shÃ)ç¾(xià n)。使用Commons-fileupload組件實(shÃ)ç¾(xià n)文件上傳,需è¦å°Ž(dÇŽo)入該組件相應(yÄ«ng)的支æ’jar包:Commons-fileuploadå’Œcommons-io。commons-io ä¸å±¬äºŽæ–‡ä»¶ä¸Šå‚³çµ„件的開(kÄi)發(fÄ)jar文件,但Commons-fileupload 組件從1.1 版本開(kÄi)å§‹,它工作時(shÃ)需è¦commons-io包的支æŒã€‚
文件上傳原ç†
å°(duì)è«‹(qÇng)æ±‚æ£æ–‡æ˜¯multipart/form-data類型的數(shù)據(jù)進(jìn)行解æžã€‚
fileupload工作æµç¨‹
fileuploadæ ¸å¿ƒAPI
DiskFileItemFactoryå·¥å» é¡ž
DiskFileItemFactory 是創(chuà ng)建 FileItem å°(duì)è±¡çš„å·¥å» ,這個(gè)å·¥å» é¡žå¸¸ç”¨æ–¹æ³•:
- public DiskFileItemFactory(int sizeThreshold, java.io.File repository):æ§‹(gòu)é€ æ–¹æ³•;
- 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)值為當(dÄng)å‰ç”¨æˆ¶çš„系統(tÇ’ng)臨時(shÃ)文件目錄,å¯é€šéŽ(guò)System.getProperty(“java.io.tmpdirâ€)æ‰“å°æŸ¥çœ‹;
ServletFileUploadè§£æžå™¨
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è)ç½®ç·¨ç¢¼æ ¼å¼;
文件上傳案例
實(shÃ)ç¾(xià n)æ¥é©Ÿ
- 創(chuà ng)建DiskFileItemFactoryå°(duì)象,è¨(shè)置緩沖å€(qÅ«)大å°å’Œè‡¨æ™‚(shÃ)文件目錄;
- 使用DiskFileItemFactory å°(duì)象創(chuà ng)建ServletFileUploadå°(duì)象,å¹¶è¨(shè)置上傳文件的大å°é™åˆ¶;
- 調(dià o)用ServletFileUpload.parseRequest方法解æžrequestå°(duì)象,得到一個(gè)ä¿å˜äº†æ‰€æœ‰ä¸Šå‚³å…§(nèi)容的Listå°(duì)象;
- å°(duì)list進(jìn)行è¿ä»£,æ¯è¿ä»£ä¸€å€‹(gè)FileItemå°(duì)象,調(dià o)用其isFormFieldæ–¹æ³•åˆ¤æ–·æ˜¯å¦æ˜¯ä¸Šå‚³æ–‡ä»¶;å¦‚æžœç‚ºæ™®é€šè¡¨å–®å—æ®µ,則調(dià o)用getFieldNameã€getStringæ–¹æ³•å¾—åˆ°å—æ®µåå’Œå—æ®µå€¼;如果為上傳文件,則調(dià o)用getInputStream方法得到數(shù)據(jù)輸入æµ,從而讀å–上傳數(shù)據(jù)。
上傳文件的處ç†ç´°(xì)節(jié)
1ã€ä¸æ–‡æ–‡ä»¶äº‚碼å•(wèn)題
文件å䏿–‡äº‚碼å•(wèn)題,å¯èª¿(dià o)用ServletUpLoaderçš„setHeaderEncoding方法,或者è¨(shè)ç½®requestçš„setCharacterEncoding屬性
2ã€è‡¨æ™‚(shÃ)文件的刪除å•(wèn)題
- 由于文件大å°è¶…出DiskFileItemFactory.setSizeThreshold方法è¨(shè)置的內(nèi)å˜ç·©æ²–å€(qÅ«)çš„å¤§å°æ™‚(shÃ),Commons-fileupload組件將使用臨時(shÃ)文件ä¿å˜ä¸Šå‚³æ•¸(shù)據(jù),å› æ¤åœ¨ç¨‹åºçµ(jié)æŸæ™‚(shÃ),å‹™(wù)必調(dià o)用FileItem.delete方法刪除臨時(shÃ)文件;
- Delete方法的調(dià o)ç”¨å¿…é ˆä½äºŽæµé—œ(guÄn)閉之åŽ,å¦å‰‡æœƒ(huì)出ç¾(xià n)文件å 用,而導(dÇŽo)致刪除失敗的情æ³;
3ã€æ–‡ä»¶å˜æ”¾ä½ç½®
- 為ä¿è‰æœå‹™(wù)器安全,上傳文件應(yÄ«ng)ä¿å˜åœ¨æ‡‰(yÄ«ng)用程åºçš„WEB-INF目錄下,或者ä¸å—WEBæœå‹™(wù)器管ç†çš„目錄;
- 為防æ¢å¤šç”¨æˆ¶ä¸Šå‚³ç›¸åŒæ–‡ä»¶å的文件,而導(dÇŽo)致文件覆蓋的情æ³ç™¼(fÄ)生,æ–‡ä»¶ä¸Šå‚³ç¨‹åºæ‡‰(yÄ«ng)ä¿è‰ä¸Šå‚³æ–‡ä»¶å…·æœ‰å”¯ä¸€æ–‡ä»¶å;
- 為防æ¢å–®å€‹(gè)目錄下文件éŽ(guò)多,影響文件讀寫(xiÄ›)速度,處ç†ä¸Šå‚³æ–‡ä»¶çš„ç¨‹åºæ‡‰(yÄ«ng)æ ¹æ“š(jù)å¯èƒ½çš„æ–‡ä»¶ä¸Šå‚³ç¸½é‡,鏿“‡åˆé©çš„目錄çµ(jié)æ§‹(gòu)生æˆç®—法,將上傳文件分散å˜å„²(chÇ”);
4ã€é¡¯ç¤ºä¸Šå‚³é€²(jìn)度
(1)ProgressListener顯示上傳進(jìn)度
ProgressListener progressListener = new ProgressListener() {
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("到ç¾(xià n)在為æ¢, " + pBytesRead + " å—節(jié)已上傳,總大å°ç‚º "
+ pContentLength);
}
};
upload.setProgressListener(progressListener);
(2)以KB為單ä½é¡¯ç¤ºä¸Šå‚³é€²(jìn)度
long temp = -1; //temp注æ„è¨(shè)置為類變é‡
long ctemp = pBytesRead /1024;
if (mBytes == ctemp)
return;
temp = mBytes;
編碼實(shÃ)ç¾(xià n)
使用工具類:GUIDUtils.javaã€DirectoryUtils.java
package com.study.java.utils;
import java.math.BigInteger;
import java.util.Random;
/**
* @Name: GUIDUtils
* @Description: 創(chuà ng)建GUID唯一å—符串工具類,åƒè€ƒstruts2æºç¢¼
* @Author: XXX
* @CreateDate: XXX
* @Version: V1.0
*/
public class GUIDUtils {
public static String generateGUID() {
return new BigInteger(165, new Random()).toString().toUpperCase() ;
}
}
package com.study.java.utils;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Name: DirectoryUtils
* @Description: 目錄創(chuà ng)建工具類
* @Author: XXX
* @CreateDate: XXX
* @Version: V1.0
*/
public class DirectoryUtils {
/**
* @Name: getChildDirectoryByDate
* @Description: æ ¹æ“š(jù)ç•¶(dÄng)剿—¥æœŸå‰µ(chuà ng)建å目錄
* @Author: XXX
* @Version: V1.0
* @CreateDate: XXX
* @Parameters: @param storeDirectory 文件å˜å„²(chÇ”)主目錄
* @Return: String
*/
public static String getChildDirectoryByDate(String storeDirectory) {
Date now = new Date() ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;
String childDirectory = sdf.format(now) ;
File file = new File(storeDirectory, childDirectory) ;
if(!file.exists()) {
file.mkdirs() ;
}
return childDirectory ;
}
/**
* @Name: getChildDirectoryByHashCode
* @Description: æ ¹æ“š(jù)文件å稱å—符串的hash碼創(chuà ng)建二級(jÃ)å目錄
* @Author: XXX
* @Version: V1.0
* @CreateDate: XXX
* @Parameters: @param storeDirectory 文件å˜å„²(chÇ”)主目錄
* @Parameters: @param filename 文件å稱
* @Return: String
*/
public static String getChildDirectoryByHashCode(String storeDirectory, String filename) {
int hashCode = filename.hashCode() ;
int dir1 = hashCode & 0xf ;
int dir2 = (hashCode & 0xf0) >> 4 ;
String childDirectory = dir1 + "/" + dir2 ;
File file = new File(storeDirectory, childDirectory) ;
if(!file.exists()) {
file.mkdirs() ;
}
return childDirectory ;
}
}
實(shÃ)ç¾(xià n)文件上傳代碼:UploadServlet.java
package com.study.java.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
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.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.study.java.utils.DirectoryUtils;
import com.study.java.utils.GUIDUtils;
/**
* @Name: UploadServlet
* @Description: 文件上傳
* @Author: XXX
* @CreateDate: XXX
* @Version: V1.0
*/
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8") ;
PrintWriter out = response.getWriter() ;
//è¨(shè)置請(qÇng)æ±‚åƒæ•¸(shù)編碼,é©ç”¨äºŽpostæäº¤,用于處ç†ä¸Šå‚³æ–‡ä»¶ä¸æ–‡ç·¨ç¢¼å•(wèn)題
request.setCharacterEncoding("UTF-8") ;
//1ã€å‰µ(chuà ng)建FileItemå·¥å» å°(duì)象
DiskFileItemFactory factory = new DiskFileItemFactory() ;
//è¨(shè)置緩沖å€(qÅ«)大å°1M,默èª(rèn)10kb
factory.setSizeThreshold(1*1024*1024) ;
//è¨(shè)置臨時(shÃ)æ–‡ä»¶å˜æ”¾ç›®éŒ„,默èª(rèn)為當(dÄng)å‰ç”¨æˆ¶ç³»çµ±(tÇ’ng)臨時(shÃ)æ–‡ä»¶å˜æ”¾ç›®éŒ„
String template = getServletContext().getRealPath("/WEB-INF/template") ;
File templatePath = new File(template) ;
if(!templatePath.exists()) {
templatePath.mkdirs() ;
}
factory.setRepository(templatePath) ;
//2ã€å‰µ(chuà ng)å»ºä¸Šå‚³æ–‡ä»¶æ ¸å¿ƒè§£æžå™¨å°(duì)象
ServletFileUpload sfu = new ServletFileUpload(factory) ;
//判斷表單æäº¤é¡žåž‹æ˜¯å¦ç‚ºmultipart/form-data
boolean isMultipartContent = sfu.isMultipartContent(request) ;
if(!isMultipartContent) {
out.write("表單æäº¤é¡žåž‹ä¸æ£ç¢º!!!") ;
}
//é™åˆ¶å–®æ–‡ä»¶ä¸Šå‚³å¤§å°
sfu.setFileSizeMax(3*1024*1024) ;
//é™åˆ¶ä¸€æ¬¡ä¸Šå‚³ç¸½æ–‡ä»¶å¤§å°
sfu.setSizeMax(10*1024*1024) ;
//3ã€è§£æžè¡¨å–®æäº¤åƒæ•¸(shù)
try {
List<FileItem> items = sfu.parseRequest(request) ;
//ç²å–表單æäº¤åƒæ•¸(shù)ä¿¡æ¯å°(duì)象
for (FileItem item : items) {
if(item.isFormField()) {
//æ™®é€šå—æ®µ
processFormField(item) ;
} else {
//ä¸Šå‚³å—æ®µ
processUploadField(item) ;
}
}
out.write("上傳æˆåŠŸ!!!") ;
response.setHeader("Refresh", "2;URL=" + request.getContextPath()) ;
} catch (FileUploadBase.FileSizeLimitExceededException e) {
out.write("單文件上傳大å°è¶…出é™åˆ¶3M.") ;
} catch (FileUploadBase.SizeLimitExceededException e) {
out.write("總文件上傳大å°è¶…出é™åˆ¶10M.") ;
} catch (FileUploadException e) {
out.write("表單æäº¤åƒæ•¸(shù)è§£æžå¤±æ•—!!!") ;
}
}
/**
* @Name: processUploadField
* @Description: 上傳表單æäº¤çš„æ–‡ä»¶
* @Author: XXX
* @Version: V1.0
* @CreateDate: XXX
* @Parameters: @param item
* @Return: void
*/
private void processUploadField(FileItem item) {
//ç²å–文件上傳主目錄
String storeDirectory = getServletContext().getRealPath("/WEB-INF/upload") ;
File file = new File(storeDirectory) ;
if(!file.exists()) {
file.mkdirs() ;
}
//ç²å–上傳文件å
String filename = item.getName() ;
if(filename != null && !"".equals(filename.toString().trim())) {
filename = GUIDUtils.generateGUID() + "_" + filename.substring(filename.lastIndexOf("//") + 1) ;
}
//ç²å–文件上傳å目錄
String childDirectory = DirectoryUtils.getChildDirectoryByHashCode(storeDirectory, filename) ;
File f = new File(storeDirectory + "/" + childDirectory, filename) ;
//上傳
try {
item.write(f) ;
} catch (Exception e) {
throw new RuntimeException("文件上傳失敗!!!") ;
}
}
/**
* @Name: processFormField
* @Description: 處ç†è¡¨å–®æäº¤æ™®é€šå—段,打å°åˆ°æŽ§åˆ¶è‡º(tái)
* @Author: XXX
* @Version: V1.0
* @CreateDate: XXX
* @Parameters: @param item
* @Return: void
*/
private void processFormField(FileItem item) {
try {
String fieldName = item.getFieldName() ;
String fieldValue = item.getString("UTF-8") ;
System.out.println(fieldName + "->" + fieldValue);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
文件下載
Web應(yÄ«ng)用ä¸å¯¦(shÃ)ç¾(xià n)文件下載的兩種方å¼
è¶…éˆæŽ¥ç›´æŽ¥æŒ‡å‘下載資æº;
程åº?qÅ«)å´¿F(xià n)下載:程åº?qÅ«)å´¿F(xià n)下載需è¨(shè)置兩個(gè)響應(yÄ«ng)é ,
(1)è¨(shè)ç½®Content-Type 的值為:application/x-msdownload。Web æœå‹™(wù)器需è¦å‘Šè¨´ç€è¦½å™¨å…¶æ‰€è¼¸å‡ºçš„å…§(nèi)å®¹çš„é¡žåž‹ä¸æ˜¯æ™®é€šçš„æ–‡æœ¬æ–‡ä»¶æˆ– HTML 文件,而是一個(gè)è¦ä¿å˜åˆ°æœ¬åœ°çš„下載文件;
(2)Web æœå‹™(wù)器希望ç€è¦½å™¨ä¸ç›´æŽ¥è™•ç†ç›¸æ‡‰(yÄ«ng)的實(shÃ)體內(nèi)容,è€Œæ˜¯ç”±ç”¨æˆ¶é¸æ“‡å°‡ç›¸æ‡‰(yÄ«ng)的實(shÃ)體內(nèi)容ä¿å˜åˆ°ä¸€å€‹(gè)文件ä¸,這需è¦è¨(shè)ç½® Content-Disposition å ±(bà o)é ã€‚è©²å ±(bà o)é æŒ‡å®šäº†æŽ¥æ”¶ç¨‹åºè™•ç†æ•¸(shù)據(jù)å…§(nèi)容的方å¼,在 HTTP 應(yÄ«ng)用ä¸åªæœ‰ attachment 是標(biÄo)準(zhÇ”n)æ–¹å¼,attachment è¡¨ç¤ºè¦æ±‚用戶干é (yù)。在 attachment åŽé¢é‚„å¯ä»¥æŒ‡å®š filename åƒæ•¸(shù),è©²åƒæ•¸(shù)是æœå‹™(wù)器建è°ç€è¦½å™¨å°‡å¯¦(shÃ)體內(nèi)容ä¿å˜åˆ°æ–‡ä»¶ä¸çš„æ–‡ä»¶å稱。在è¨(shè)ç½® Content-Dispostion 之å‰ä¸€å®šè¦æŒ‡å®š Content-Type。
(3)å› ?yà n)æ©î€®èžºd的文件å¯ä»¥æ˜¯å„種類型的文件,所以è¦å°‡æ–‡ä»¶å‚³é€çµ¦å®¢æˆ¶ç«¯,其相應(yÄ«ng)å…§(nèi)容應(yÄ«ng)該被當(dÄng)åšäºŒé€²(jìn)制來(lái)處ç†,所以應(yÄ«ng)該調(dià o)用response.getOutputStream()方法返回 ServeltOutputStream å°(duì)象來(lái)å‘客戶端寫(xiÄ›)入文件內(nèi)容。
response.setContentType("application/x-msdownload") ;
String str = "attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8") ;
response.setHeader("Content-Disposition", str) ;
InputStream is = new FileInputStream(file) ;
OutputStream os = response.getOutputStream() ;
int len = -1 ;
byte[] buf = new byte[1024] ;
while((len = is.read(buf)) != -1) {
os.write(buf, 0, len) ;
os.flush() ;
}
is.close() ;
os.close() ;
下載案例
éæ·ä¸Šå‚³ç›®éŒ„ä¸‹çš„æ‰€æœ‰æ–‡ä»¶é¡¯ç¤ºçµ¦ç”¨æˆ¶,å¹¶å…許用戶完æˆä¸‹è¼‰ã€‚
(1)ShowAllUploadFiles.java
package com.study.java.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Name: ShowAllUploadFiles
* @Description: 顯示所有已經(jīng)上傳的文件
* @Author: XXX
* @CreateDate: XXX
* @Version: V1.0
*/
public class ShowAllUploadFiles extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Map<String, String> map = new HashMap<String, String>() ;
//ç²å–文件上傳主目錄
String storeDirectory = getServletContext().getRealPath("/WEB-INF/upload") ;
File file = new File(storeDirectory) ;
treeWalk(file, map) ;
request.setAttribute("map", map) ;
request.getRequestDispatcher("/listFiles.jsp").forward(request, response) ;
}
/**
* @Name: treeWalk
* @Description: 將文件上傳主目錄ä¸çš„æ‰€æœ‰æ–‡ä»¶å稱放入到Map集åˆä¸
* @Author: XXX
* @Version: V1.0
* @CreateDate: XXX
* @Parameters: @param file
* @Parameters: @param map
* @Return: void
*/
private void treeWalk(File file, Map<String, String> map) {
if(file.isDirectory()) {
File[] list = file.listFiles() ;
for (File f : list) {
treeWalk(f, map) ;
}
} else {
String guidFileName = file.getName() ;
String oldFileName = guidFileName.substring(guidFileName.indexOf("_") + 1) ;
map.put(guidFileName, oldFileName) ;
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
(2)JSP視圖é (yè)é¢
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<c:forEach items="${map}" var="me">
<c:url value="/servlet/DownloadServlet" var="url">
<c:param name="guidFileName" value="${me.key}"/>
</c:url><hr/>
${me.value}
<a href="${url}">下載</a><hr/>
</c:forEach>
</body>
</html>
(3)DownloadServlet.java
package com.study.java.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.study.java.utils.DirectoryUtils;
/**
* @Name: DownloadServlet
* @Description: 文件下載
* @Author: XXX
* @CreateDate: XXX
* @Version: V1.0
*/
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//ç²å–è«‹(qÇng)æ±‚éˆæŽ¥ä¸çš„åƒæ•¸(shù),并進(jìn)行編碼,解決文件åä¸å¸¶ä¸æ–‡çš„æƒ…æ³
String guidFileName = request.getParameter("guidFileName") ;
guidFileName = new String(guidFileName.getBytes("ISO-8859-1"), "utf-8") ;
//ç²å–文件儲(chÇ”)å˜ç›®éŒ„
String storeDirectory = getServletContext().getRealPath("/WEB-INF/upload") ;
String childDirectory = DirectoryUtils.getChildDirectoryByHashCode(storeDirectory, guidFileName) ;
File file = new File(storeDirectory + "/" + childDirectory, guidFileName) ;
if(file.exists()) {
//通知客戶端下載
String oldFileName = guidFileName.substring(guidFileName.indexOf("_") + 1) ;
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(oldFileName, "UTF-8")) ;
//下載
InputStream is = new FileInputStream(file) ;
OutputStream os = response.getOutputStream() ;
int len = -1 ;
byte[] buf = new byte[1024] ;
while((len = is.read(buf)) != -1) {
os.write(buf, 0, len) ;
os.flush() ;
}
is.close() ;
os.close() ;
} else {
throw new RuntimeException("下載文件ä¸å˜åœ¨!!!") ;
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
相關(guÄn)案例查看更多
相關(guÄn)閱讀
- 云å—å°ç¨‹åºåˆ¶ä½œ
- 百度排å
- 楚雄網(wÇŽng)站建è¨(shè)å…¬å¸
- 公眾號(hà o)æ¨¡æ¿æ¶ˆæ¯
- å ±(bà o)廢車管ç†
- 云å—å°ç¨‹åºé–‹(kÄi)發(fÄ)å…¬å¸å“ªå®¶å¥½
- 百度å°ç¨‹åºå…¬å¸
- 云å—ç¶²(wÇŽng)站建è¨(shè)å…¬å¸åœ°å€
- é–‹(kÄi)發(fÄ)微信å°ç¨‹åº
- 云å—建站公å¸
- äºŒå‰æ¨¹(shù)
- 支付寶å°ç¨‹åºè¢«é¨™
- ç¶²(wÇŽng)站建è¨(shè)é èœå…¬å¸
- ç¶²(wÇŽng)站建è¨(shè)招商
- å€(qÅ«)塊éˆ
- 汽車拆解管ç†ç³»çµ±(tÇ’ng)
- 百度推廣
- ç¶²(wÇŽng)站建è¨(shè)æœå‹™(wù)å…¬å¸
- ç¶²(wÇŽng)站建è¨(shè)列表網(wÇŽng)
- 云å—ç¶²(wÇŽng)站建è¨(shè)哪家公å¸å¥½
- 政府網(wÇŽng)站建è¨(shè)æœå‹™(wù)
- å ±(bà o)廢車拆解管ç†ç³»çµ±(tÇ’ng)
- 電商網(wÇŽng)站建è¨(shè)
- ç¶²(wÇŽng)é (yè)制作
- 曲é–å°ç¨‹åºé–‹(kÄi)發(fÄ)
- 高端網(wÇŽng)站建è¨(shè)å…¬å¸
- å—通å°ç¨‹åºåˆ¶ä½œå…¬å¸
- 云å—å°ç¨‹åºé–‹(kÄi)發(fÄ)課程
- ç¶²(wÇŽng)站優(yÅu)化哪家好
- 昆明å°ç¨‹åºä»£å»º