javascript
SpringMVC的上传与下载
文章目錄
- SpringMVC的上傳
- SpringMVC的下載
SpringMVC的上傳
[1] 上傳的功能需求
隨著我們互聯(lián)網(wǎng)的發(fā)展,我們的用戶從直接訪問網(wǎng)站獲取信息。變?yōu)橄M麑⒆约罕镜氐?br /> 資源發(fā)送給服務(wù)器,讓服務(wù)器提供給其他人使用或者查看。還有部分的用戶希望可以將
本地的資源上傳服務(wù)器存儲(chǔ)起來,然后再其他的電腦中可以通過訪問網(wǎng)站來獲取上傳的
資源,這樣用戶就可以打破空間的局限性,再任何時(shí)候只要有網(wǎng)有電腦就可以對(duì)自己的
資源進(jìn)行操作,比如:云存儲(chǔ),云編輯。
[2] 上傳的原理圖
[3] 上傳的前臺(tái)實(shí)現(xiàn)
在頁面中使用input標(biāo)簽,type值設(shè)置為”file”即可
上傳成功后的響應(yīng)結(jié)果在當(dāng)前頁面顯示,使用ajax請(qǐng)求來完成資源的發(fā)送
請(qǐng)求數(shù)據(jù):
上傳的文件本身
普通數(shù)據(jù):用戶名,Id,密碼等,建議上傳功能中不攜帶除上傳資源以外的數(shù) 據(jù)
數(shù)據(jù)格式:
傳統(tǒng)的請(qǐng)求中,請(qǐng)求數(shù)據(jù)是以鍵值對(duì)的格式來發(fā)送給后臺(tái)服務(wù)器的,但是在
上傳請(qǐng)求中,沒有任何一個(gè)鍵可以描述上次的數(shù)據(jù),因?yàn)閿?shù)據(jù)本身是非常大的
鍵就相當(dāng)于一個(gè)變量,我們使用一個(gè)變量存儲(chǔ)一個(gè)10g的電影顯然是不可能 的。在上傳請(qǐng)求中,將請(qǐng)求數(shù)據(jù)以二進(jìn)制流的方式發(fā)送給服務(wù)器。
① 創(chuàng)建FormData的對(duì)象,將請(qǐng)求數(shù)據(jù)存儲(chǔ)到該對(duì)象中發(fā)送
② 將processData屬性的值設(shè)置為false,告訴瀏覽器發(fā)送對(duì)象請(qǐng)求數(shù)據(jù)
③ 將contentType屬性的值設(shè)置為false,設(shè)置請(qǐng)求數(shù)據(jù)的類型為二進(jìn)制類型。
④ 正常發(fā)送ajax即可
后臺(tái)服務(wù)器處理完成后,響應(yīng)一個(gè)json對(duì)象給瀏覽器,示例格式如下:
{
state:true,
msg:“服務(wù)器繁忙”,
url:”上傳成功的資源的請(qǐng)求地址”
}
[4] 上傳的后臺(tái)實(shí)現(xiàn)
注意:
需要在項(xiàng)目導(dǎo)入上傳相關(guān)的jar包
傳統(tǒng)的請(qǐng)求中,上傳的數(shù)據(jù)是鍵值對(duì)數(shù)據(jù),我們可以直接使用request對(duì)象中
的getParameter(“鍵名”)來獲取請(qǐng)求數(shù)據(jù),或者在單元方法上聲明形參來
接收DispatcherServlect傳遞的請(qǐng)求數(shù)據(jù)。而在上傳請(qǐng)求中,請(qǐng)求數(shù)據(jù)是二
進(jìn)制流數(shù)據(jù),tomcat服務(wù)器在接收到請(qǐng)求后,仍然將請(qǐng)求數(shù)據(jù)封裝到request對(duì) 象中,調(diào)用DispatcherServlet處理請(qǐng)求,并將存儲(chǔ)了上傳請(qǐng)求數(shù)據(jù)的request 對(duì)象作為實(shí)參傳遞給DispatcherServlet,而DispatcherServlet會(huì)根據(jù)請(qǐng)求調(diào)用對(duì) 應(yīng)的單元方法來處理請(qǐng)求,而這個(gè)時(shí)候因?yàn)閞equest中存儲(chǔ)的是二進(jìn)制請(qǐng)求數(shù)據(jù)
我們就無法再使用req.getParameter來獲取請(qǐng)求數(shù)據(jù)了。我們希望 DispatcherServlet將request對(duì)象中的二進(jìn)制數(shù)據(jù)進(jìn)行解析,然后將解析后的結(jié) 果傳遞給單元方法處理。也就是說DispatcherServlet會(huì)調(diào)用一個(gè)工具類來完成
二進(jìn)制數(shù)據(jù)的解析,所以需要我們?cè)趕pringmvc.xml文件中配置上傳解析的bean
對(duì)象給DispatcherServlet使用。其實(shí)說白了就是需要在springmvc.xml文件中
配置SpringMVC官方提供的上傳解析bean即可,我們正常的在單元方法上,聲
明形參直接接收解析后的結(jié)果完成請(qǐng)求處理即可。
① 確定資源要寫入到硬盤中的存儲(chǔ)路徑
② 確定文件存儲(chǔ)的文件名,每次存儲(chǔ)的文件名都是唯一的。
③ 使用IO流將文件輸出到服務(wù)器硬盤中存儲(chǔ)起來
① 設(shè)置單元方法的返回值類型為void
② 使用response對(duì)象完成直接響應(yīng)
③ 響應(yīng)一個(gè)json字符串給瀏覽器
{
state:true,
msg:“服務(wù)器繁忙”,
url:”上傳成功的資源的請(qǐng)求地址”
}
上傳解析bean的配置
<!--配置上傳解析bean:給DispatcherServlet使用,調(diào)用該bean對(duì)象完成request對(duì)象中的上傳數(shù)據(jù)的解析--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
單元方法代碼示例:
//聲明單元方法:處理文件上傳請(qǐng)求 /**** 形參MultipartFile* 該形參是用來接收DispatcherServlet解析request對(duì)象后存儲(chǔ)了文件二進(jìn)制數(shù)據(jù)的對(duì)象。* 形參的名字必須是上傳請(qǐng)求中的文件的鍵名* @param photo* @param response*/ @RequestMapping("regUpload") public void regUpload(MultipartFile photo, HttpServletResponse response, HttpServletRequest request) throws IOException {//1.確定文件存儲(chǔ)路徑//使用ServletContext對(duì)象動(dòng)態(tài)獲取項(xiàng)目根目錄下的upload文件夾的路徑,作為資源存儲(chǔ)路徑String path=request.getServletContext().getRealPath("/upload");System.out.println(path);//2.確定文件存儲(chǔ)的名字//獲取文件的原始名 ab.c.jpgString oldName=photo.getOriginalFilename();//獲取文件存儲(chǔ)的后綴名String suffix=oldName.substring(oldName.lastIndexOf("."));//.jpg//創(chuàng)建文件新的名字 名+后綴 比如 a.jpgString newName= UUID.randomUUID()+""+suffix;//3.完成存儲(chǔ)//創(chuàng)建file對(duì)象存儲(chǔ)資源路徑File f=new File(path);if(!f.exists()){f.mkdirs();//創(chuàng)建存儲(chǔ)路徑}//輸出存儲(chǔ)photo.transferTo(new File(f,newName));//4.響應(yīng)結(jié)果//創(chuàng)建UploadResult對(duì)象存儲(chǔ)響應(yīng)數(shù)據(jù)UploadResult uploadResult=new UploadResult(true,"",newName);//將uploadResult對(duì)象轉(zhuǎn)換為json對(duì)象String jsonStr=new Gson().toJson(uploadResult);//直接響應(yīng)response.getWriter().write(jsonStr); }SpringMVC的下載
[1] 下載的基本流程
文件的上傳是將用戶本地的資源發(fā)送到服務(wù)器,讓服務(wù)器存儲(chǔ)到其硬盤中的過程。
而下載和上傳正好是相反的過程。下載是用戶發(fā)起請(qǐng)求,請(qǐng)求要下載的資源。服務(wù)器
根據(jù)請(qǐng)求,將其硬盤中的文件資源發(fā)送給瀏覽器的過程。
[2] 下載的請(qǐng)求數(shù)據(jù)
用戶通過瀏覽器發(fā)起下載請(qǐng)求,服務(wù)器在接收到請(qǐng)求后,根據(jù)當(dāng)前請(qǐng)求的用戶信息,去 數(shù)據(jù)庫中獲取當(dāng)前用戶要下載的資源的文件路徑,然后服務(wù)器再去其硬盤中讀取對(duì)應(yīng)的 文件,將文件響應(yīng)給瀏覽器,基于此過程,下載請(qǐng)求的請(qǐng)求數(shù)據(jù)為:
簡(jiǎn)單的下載:文件的路徑直接作為一個(gè)字段存儲(chǔ)在用戶信息表中
用戶的ID。
復(fù)雜的下載:數(shù)據(jù)庫中專門有一張表記錄要下載的文件資源
用戶的ID
要下載的資源ID
[3] 下載的后臺(tái)實(shí)現(xiàn)
[4] 下載的示例代碼
//聲明單元方法:處理下載請(qǐng)求 @RequestMapping("downFile") public void downFile(String filename, HttpServletResponse response, HttpServletRequest request) throws IOException {//設(shè)置下載資源的MIME類型?//設(shè)置響應(yīng)頭,告訴瀏覽器下載的資源需要存儲(chǔ)到客戶端的硬盤中,而不是解析打開。response.setHeader("Content-Disposition", "attachment;filename="+filename);//1.獲取要下載的資源的流對(duì)象//獲取文件的絕對(duì)路徑String path=request.getServletContext().getRealPath("/upload");//獲取文件的二進(jìn)制數(shù)據(jù)byte[] bytes = FileUtils.readFileToByteArray(new File(path, filename));//2.響應(yīng)瀏覽器//獲取輸出流對(duì)象ServletOutputStream outputStream = response.getOutputStream();//響應(yīng)資源outputStream.write(bytes); }總結(jié)
以上是生活随笔為你收集整理的SpringMVC的上传与下载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪种软件可以快速搜索自己家的电脑配置适合
- 下一篇: SpringMVC的运行原理