日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringMVC的上传与下载

發(fā)布時(shí)間:2023/12/3 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringMVC的上传与下载 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 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)

  • 如何在頁面中顯示一個(gè)按鈕,用戶可以點(diǎn)擊該按鈕后選擇本地要上傳的文件
    在頁面中使用input標(biāo)簽,type值設(shè)置為”file”即可
  • 確定上傳請(qǐng)求的發(fā)送方式
    上傳成功后的響應(yīng)結(jié)果在當(dāng)前頁面顯示,使用ajax請(qǐng)求來完成資源的發(fā)送
  • 上傳請(qǐng)求的請(qǐng)求數(shù)據(jù)及其數(shù)據(jù)格式
    請(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ù)器。
  • 在ajax中如何發(fā)送二進(jìn)制流數(shù)據(jù)給服務(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)該響應(yīng)什么結(jié)果給瀏覽器,并且瀏覽器如何處理
    后臺(tái)服務(wù)器處理完成后,響應(yīng)一個(gè)json對(duì)象給瀏覽器,示例格式如下:
    {
    state:true,
    msg:“服務(wù)器繁忙”,
    url:”上傳成功的資源的請(qǐng)求地址”
    }
  • 代碼示例(注冊(cè)功能,用戶頭像):
  • <%--聲明js代碼域--%> <script type="text/javascript">/****************資源上傳功能實(shí)現(xiàn)**********************************/$(function () {//給上傳按鈕增加單擊事件$("#btnUpload").click(function () {//獲取要上傳的文件資源var file=$("#file")[0].files[0];//創(chuàng)建FormData對(duì)象存儲(chǔ)要上傳的資源var formData=new FormData();formData.append("photo",file);//發(fā)起ajax請(qǐng)求完成資源上傳$.ajax({type:"post",//使用post類型的請(qǐng)求data:formData,//請(qǐng)求數(shù)據(jù)url:"regUpload",//請(qǐng)求地址processData:false,contentType:false,success:function (data) {//回調(diào)函數(shù)//將響應(yīng)數(shù)據(jù)轉(zhuǎn)換為json對(duì)象eval("var obj="+data);//判斷if(obj.status==true){alert("上傳成功")}else{alert(obj.msg);}}})})}) </script>

    [4] 上傳的后臺(tái)實(shí)現(xiàn)
    注意:

    需要在項(xiàng)目導(dǎo)入上傳相關(guān)的jar包

  • 如何在單元方法中獲取上傳請(qǐng)求的請(qǐng)求數(shù)據(jù)
  • 傳統(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ǔ)到服務(wù)器的硬盤中
  • ① 確定資源要寫入到硬盤中的存儲(chǔ)路徑
    ② 確定文件存儲(chǔ)的文件名,每次存儲(chǔ)的文件名都是唯一的。
    ③ 使用IO流將文件輸出到服務(wù)器硬盤中存儲(chǔ)起來

  • 將上傳的結(jié)果響應(yīng)給瀏覽器
  • ① 設(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)

  • 創(chuàng)建單元方法處理下載請(qǐng)求
  • 根據(jù)請(qǐng)求獲取要下載的資源的流對(duì)象
  • 讀取文件并將資源響應(yīng)給瀏覽器
  • [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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。