Springboot接收文件與發(fā)送文件實例教程
前言
前后端涉及到文件的傳輸,都是以二進制流的形式進行交互的。
一、前端上傳文件,Springboot接受并保存在某個路徑
示例:springboot內(nèi)部封裝了MultipartFile接口,用于接收和處理前端發(fā)送過來的文件。
1.引入庫
代碼如下(示例):
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID;
2.前端核心代碼(發(fā)送文件)
代碼如下(示例):
<form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="multipartfile" accept="image/png" value="請選擇文件"> <input type="submit" value="上傳"> </form>
action屬性指定了uoload接口。發(fā)送文件的請求方式method必須是post,因為需要http請求報文的數(shù)據(jù)體封裝文件數(shù)據(jù)。
編碼方式enctype必須是“multipart/form-data”,指表單數(shù)據(jù)中由多部分構(gòu)成,既有文本數(shù)據(jù),又有文件等二進制數(shù)據(jù)。默認情況下,enctype的值是“application/x-www-form-urlencoded”,不能用于文件上傳,只有使用了“multipart/form-data”,才能完整的傳遞文件數(shù)據(jù)。“application/x-www-form-urlencoded”不是不能上傳文件,是只能上傳文本格式的文件,multipart/form-data是將文件以二進制的形式上傳,這樣可以實現(xiàn)多種類型的文件上傳。accept屬性是用來指定文件類型的,屬性值"image/png"表示只能上傳.png圖片的文件。
3.Controller類
代碼如下(示例):
@RestController public class uploadcontroller { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); @PostMapping("/upload") public String upload(MultipartFile multipartfile, HttpServletRequest request){ String realPath = request.getSession().getServletContext().getRealPath("/update/"); String format=sdf.format(new Date()); File folder=new File(realPath+format); if(!folder.isDirectory()){ folder.mkdirs(); } String oldname = multipartfile.getOriginalFilename(); String newname = UUID.randomUUID().toString()+oldname.substring(oldname.lastIndexOf("."),oldname.length()); try { multipartfile.transferTo(new File(folder, newname)); System.out.println(new File(folder, newname).getAbsolutePath());//輸出(上傳文件)保存的絕對路徑 String filePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/update/"+format+newname; return filePath+"上傳成功"; } catch (IOException e){ e.printStackTrace(); } return "上傳失敗!"; } }
multipartfile封裝了接受到的文件,multipartfile.getOriginalFilename()獲取上傳文件的完整名稱,包括文件名和文件擴展名(如.png,.txt等指定文件類型的后綴);multipartfile.transferTo(new File(folder, newname))將接受文件下載到new File(folder, newname)對象指定的路徑下。
request封裝了http請求對象。request.getSession()獲取一個http請求的session(會話);getServletContext()獲取一個http請求對應(yīng)的web應(yīng)用上下文;getRealPath(“/update/”)獲取一個相對(web應(yīng)用上下文)地址為“/update/”的絕對地址。
4.注意事項
處理前端post請求的接口必須要用 @PostMapping注解,否則post請求無法訪問成功?。。?!
二、Springboot發(fā)送文件,前端接收并下載。
示例:MIME(Multipurpose Internet Mail Extensions)是一種多用途互聯(lián)網(wǎng)郵件擴展。但不局限于郵件,適用于所有的瀏覽器能接受的文件。服務(wù)器會將它們發(fā)送的多媒體數(shù)據(jù)的類型告訴瀏覽器,而通知手段就是說明該多媒體數(shù)據(jù)的MIME類型,從而讓瀏覽器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服務(wù)器將MIME標志符放入傳送的數(shù)據(jù)中來告訴瀏覽器使用哪種插件讀取相關(guān)文件。
Springboot可通過(HttpServletResponse對象)response.setContentType(contenttype)設(shè)置發(fā)送到瀏覽器(前端)的響應(yīng)內(nèi)容的類型。
給瀏覽器(前端)的文件必須是以二進制流的形式發(fā)送的(在Java中要用io流對發(fā)送文件進行處理,以字節(jié)數(shù)組(byte[])的形式發(fā)送),因為只有以二進制的形式,才能處理文件中多類型的數(shù)據(jù)。
1.引入庫
代碼如下(示例):
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.io.IOException;
2.前端核心代碼(發(fā)送文件)
代碼如下(示例):
<a href="/load" rel="external nofollow" download="file">下載文件</a>
href屬性設(shè)置請求接口為"/load",download表明這是一個請求下載的鏈接,且下載到的文件會被自動改名為"file"。這種請求方式是get形式。
3.Controller類
代碼如下(示例):
@RestController public class loadcontroller { @GetMapping("/load") public void fileload( HttpServletResponse response) throws IOException { File f = new File("C:\\Users\\Java\\Desktop\\新建 文本文檔.txt"); FileInputStream ips = new FileInputStream(f); OutputStream ops = response.getOutputStream(); response.setContentType("application/octet-stream; charset=UTF-8"); byte[] a = new byte[1000]; ips.read(a); ops.write(a); } } //本代碼在執(zhí)行結(jié)束后并沒有手動關(guān)閉對應(yīng)的io流,讀者可自行解決
通過response.getOutputStream()得到ServletOutputStream接口,ServletOutputStream是OutputStream的子接口。(HttpServletResponse)response的輸出流對應(yīng)的是http響應(yīng)內(nèi)容,通過response輸出流的write方法就可以給http響應(yīng)報文的數(shù)據(jù)體內(nèi)寫內(nèi)容了,從而發(fā)送給對應(yīng)的瀏覽器。
response.setContentType(“application/octet-stream; charset=UTF-8”)設(shè)置響應(yīng)內(nèi)容的類型為二進制流(application/octet-stream),字符編碼方式為UTF-8。
4.注意事項
凡是以一個UIR鏈接進行后端接口訪問的請求方式都是get方式,對應(yīng)的接口必須用 @GetMapping進行注解,表明該接口可以接受get請求。
凡是返回數(shù)據(jù)的Controller類都應(yīng)該用@RestController標注,@Controller標注的Controller類是返回視圖的。
總結(jié)
到此這篇關(guān)于Springboot接收文件與發(fā)送文件的文章就介紹到這了,更多相關(guān)Springboot接收文件與發(fā)送文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
反射機制:getDeclaredField和getField的區(qū)別說明
這篇文章主要介紹了反射機制:getDeclaredField和getField的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java判斷object對象為空(包括null ,““)的方法
這篇文章主要介紹了Java判斷對象是否為空(包括null ,“”)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12非常適合新手學(xué)生的Java線程池優(yōu)化升級版
作者是一個來自河源的大三在校生,以下筆記都是作者自學(xué)之路的一些淺薄經(jīng)驗,如有錯誤請指正,將來會不斷的完善筆記,幫助更多的Java愛好者入門2022-03-03Java基于Calendar類輸出指定年份和月份的日歷代碼實例
這篇文章主要介紹了Java 使用Calendar類輸出指定年份和月份的日歷,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02Spring?Boot中使用Spring?Retry重試框架的操作方法
這篇文章主要介紹了Spring?Retry?在SpringBoot?中的應(yīng)用,介紹了RetryTemplate配置的時候,需要設(shè)置的重試策略和退避策略,需要的朋友可以參考下2022-04-04