java實(shí)現(xiàn)文件上傳和下載
本文實(shí)例為大家分享了java實(shí)現(xiàn)文件上傳和下載的具體代碼,供大家參考,具體內(nèi)容如下
文件的上傳
upload:文件上傳
客戶(hù)端通過(guò)表單的文件域file 把客戶(hù)端的文件 上傳保存到服務(wù)器的硬盤(pán)上
頁(yè)面
首先對(duì)上傳的表單有以下要求:
- 必須有文件域:input type=file
- 表單提交方式:method=post
- 表單的 enctype=multipart/form-data
<form method="post" action="/user/regist" enctype="multipart/form-data">
<table style="border: chartreuse;solid:2px">
<tr>
<th>用戶(hù)名</th>
<td><input type="text" name="username"></td>
</tr>
<tr>
<th>密碼</th>
<td><input type="password" name="password"></td>
</tr>
<tr>
<th>用戶(hù)頭像</th>
<td><input type="file" name="photo"> </td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"></td>
</tr>
</table>
</form>
Servlet
1)首先要導(dǎo)入以下兩個(gè)jar包,通過(guò)commons-fileupload實(shí)現(xiàn)文件上傳

2)創(chuàng)建一個(gè)工廠(chǎng)對(duì)象DiskFileItemFactory,在創(chuàng)建一個(gè)多部件表單解析器ServletFileUpload,構(gòu)造方法傳入工廠(chǎng)對(duì)象
3)解析器解析請(qǐng)求對(duì)象,獲得一個(gè)list集合,其中l(wèi)ist集合存儲(chǔ)的是一個(gè)一個(gè)的fileItem對(duì)象,一個(gè)fileItem對(duì)應(yīng)一個(gè)組件,也就是一個(gè)<input>
4) 遍歷集合用isFormField()方法判斷是否為普通組件,然后著重處理文件域組件
5)獲取文件名,并用getRealPath方法獲取服務(wù)器上傳文件所在路徑,創(chuàng)建新文件夾
6)獲取輸入流和創(chuàng)建輸出流,進(jìn)行文件的讀寫(xiě)
@WebServlet(value = "/user/regist")
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//創(chuàng)建一個(gè)工廠(chǎng)對(duì)象
DiskFileItemFactory factory = new DiskFileItemFactory();
//創(chuàng)建一個(gè)多部件解析器對(duì)象
ServletFileUpload fileUpload = new ServletFileUpload(factory);
User user = new User();
FileOutputStream out=null;
try {
//用解析器對(duì)象解析請(qǐng)求,返回一個(gè)FileItem類(lèi)型的集合
List<FileItem> list = fileUpload.parseRequest(req);
for (FileItem fileItem : list) {
/**
* fileItem.getFieldName());:::獲取組件的name值
* fileItem.getName());::::獲取文件域的文件名
* fileItem.getSize());::::獲取數(shù)據(jù)的字節(jié)個(gè)數(shù)
* fileItem.getString());::::獲取數(shù)據(jù)的字符串
* fileItem.isFormField());:::判斷是否為普通組件
*/
//判斷部件是否為普通組件
if (fileItem.isFormField()) {//普通組件
//獲取組件名字也就是name的值
String fieldName = fileItem.getFieldName();
//獲取組件的值也就是value的值
String value = fileItem.getString("utf-8");
if ("username".equals(fieldName)) { //設(shè)置實(shí)體類(lèi)的屬性
user.setUsername(value);
} else if ("password".equals(fieldName)) {
user.setPassword(value);
}
} else {// 文件域
//獲取文件名
String fielName = fileItem.getName();
//輸入流來(lái)讀數(shù)據(jù)
InputStream in = fileItem.getInputStream();
//設(shè)置文件寫(xiě)出的路徑,并用隨機(jī)碼來(lái)保證圖片可以重復(fù)
String path=req.getServletContext().getRealPath("/imgs/"+ UUID.randomUUID()+fielName);
System.out.println("文件路徑為:"+path);
File file = new File(path);
out = new FileOutputStream(file);
//利用commons-io-1.4.jar的IOUtils的copy方法直接實(shí)現(xiàn)文件的復(fù)制
IOUtils.copy(in,out);
user.setPhoto(file.getName());
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(out!=null){
out.close();
}
}
req.getSession().setAttribute("user",user);
req.getRequestDispatcher("/sucess.jsp").forward(req,resp);
}
}
文件的下載
頁(yè)面
只需一個(gè)超鏈接,傳需要下載的文件名,或者直接輸入路徑在瀏覽器
例: <a href="<c:url value='/file/download?fileName=14.jpg'/>" >狗狗1</a><br/>
Servlet
1)接收參數(shù),獲取文件名
2)獲取imgs的路徑,也就是存儲(chǔ)文件的文件夾的路徑,然后創(chuàng)建文件,傳入該路徑和文件名
3)創(chuàng)建輸入流讀取文件
4)設(shè)置響應(yīng)頭,首先根據(jù)文件名字獲取文件的大類(lèi)型,設(shè)置響應(yīng)頭Content-Type指定響應(yīng)的類(lèi)型;設(shè)置響應(yīng)頭Content-Disposition,指定文件以附件形式保存到本地磁盤(pán)
5)用響應(yīng)獲取輸出流,讀出文件到客戶(hù)端
@WebServlet("/user/download")
public class DownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//獲取要下載的文件名
String fileName = request.getParameter("fileName");
System.out.println(fileName);
//獲取服務(wù)器中存儲(chǔ)圖片的文件夾的路徑
String path1 = request.getServletContext().getRealPath("/imgs");
String path=path1+"/"+fileName;
File file = new File(path);
//創(chuàng)建輸入流讀文件
FileInputStream in = new FileInputStream(file);
//通過(guò)文件名字獲取文件的大類(lèi)型
String type = request.getServletContext().getMimeType(fileName);
//設(shè)置響應(yīng)頭ContentType指定響應(yīng)內(nèi)容的類(lèi)型
response.setHeader("Content-type",type);
//設(shè)置響應(yīng)頭Content-Disposition 指定以附件形式保存響應(yīng)的信息
response.setHeader("Content-Disposition","attachment;filename="+(URLEncoder.encode(fileName, "utf-8")));
ServletOutputStream out = response.getOutputStream();
//實(shí)現(xiàn)文件的讀寫(xiě)
IOUtils.copy(in,out);
if(in!=null){
in.close();
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java如何實(shí)現(xiàn)post請(qǐng)求webservice服務(wù)端
這篇文章主要介紹了java如何實(shí)現(xiàn)post請(qǐng)求webservice服務(wù)端,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
詳解使用spring boot admin監(jiān)控spring cloud應(yīng)用程序
這篇文章主要介紹了詳解使用spring boot admin監(jiān)控spring cloud應(yīng)用程序,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
SpringBoot集成圖片驗(yàn)證碼框架easy-captcha的詳細(xì)過(guò)程
本文介紹了如何將Easy-Captcha框架集成到SpringBoot項(xiàng)目中,實(shí)現(xiàn)圖片驗(yàn)證碼功能,Easy-Captcha是一款輕量級(jí)的開(kāi)源驗(yàn)證碼框架,通過(guò)簡(jiǎn)潔的API和高度可定制性,可以快速實(shí)現(xiàn)驗(yàn)證碼功能,文章詳細(xì)介紹了如何配置、生成和展示驗(yàn)證碼,并提供了Easy-Captcha的GitHub地址2025-03-03
SpringMVC + servlet3.0 文件上傳的配置和實(shí)現(xiàn)代碼
本篇文章主要介紹了SpringMVC + servlet3.0 文件上傳的配置和實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
Java 8中Collectors.toMap空指針異常源碼解析
這篇文章主要為大家介紹了Java 8中Collectors.toMap空指針異常源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
SpringBoot項(xiàng)目后端開(kāi)發(fā)邏輯全面梳理
這篇文章主要介紹了SpringBoot項(xiàng)目后端開(kāi)發(fā)邏輯全面梳理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Spring security基于數(shù)據(jù)庫(kù)中賬戶(hù)密碼認(rèn)證
這篇文章主要介紹了Spring security基于數(shù)據(jù)庫(kù)中賬戶(hù)密碼認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03

