Quarkus中實(shí)現(xiàn)Resteasy的文件上傳下載操作
前言
做java web開(kāi)發(fā),文件的上傳和下載是一個(gè)非常常見(jiàn)的需求場(chǎng)景。在spring生態(tài)下的文件上傳下載非常簡(jiǎn)單,記得五年前,我剛寫(xiě)博的時(shí)候也寫(xiě)過(guò)spring的上傳和下載《SpringMvc實(shí)現(xiàn)文件上傳與下載》,以及Struts2的文件上傳和下載《java Struts2實(shí)現(xiàn)文件上傳下載》。今天來(lái)看看Quarkus框架中是如何實(shí)現(xiàn)的,因?yàn)镼uarkus的JAX-RS采用Resteasy的實(shí)現(xiàn),故Quarkus中的文件上傳和下載,也就是Resteasy框架的上傳和下載了。
Resteasy文檔:https://docs.jboss.org/resteasy/docs/4.3.1.Final/
文件上傳
首先引入依賴(lài)
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-multipart-provider</artifactId> </dependency>
這個(gè)依賴(lài)主要用于支持multipart/form-data的請(qǐng)求,接下來(lái)需要定義一個(gè)接收multipart/form-data表單數(shù)據(jù)的實(shí)體類(lèi),如下:
public class UploadEntity{ @FormParam("file") private InputPart file; @FormParam("fileName") private String fileName; public InputPart getFile() { return file; } public void setFile(InputPart file) { this.file = file; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } }
以上代碼用來(lái)映射表單中的屬性值,除了文件流,只支持字符串類(lèi)型的屬性。其中file字段用來(lái)接收上傳的文件,除了可以用InputPart類(lèi)型來(lái)接收,上傳文件還可以使用InputStream、byte[]、File等接收,這里使用InputPart來(lái)接收是為了方便接下來(lái)從Header參數(shù)里獲取文件名,如:
@POST @Path("/upload") @Consumes(MediaType.MULTIPART_FORM_DATA) public Response upload(@MultipartForm UploadEntity uploadEntity) throws IOException { InputStream i = uploadEntity.getFile().getBody(InputStream.class, null); String[] contentDisposition = uploadEntity.getFile().getHeaders().getFirst("Content-Disposition").split(";"); String fileName = ""; for (String filename : contentDisposition) { if ((filename.trim().startsWith("filename"))) { String[] name = filename.split("="); fileName = name[1].trim().replaceAll("\"", ""); } } logger.info("上傳文件名:{}", fileName); logger.info("表單提交的文件名:{}", uploadEntity.getFileName()); logger.info("上傳文件內(nèi)容:{}", IOUtils.toString(i, StandardCharsets.UTF_8)); return Response.ok("ok").build(); }
InputPart實(shí)體承載了文件流,以及請(qǐng)求體信息,可以通過(guò)getBody來(lái)獲取文件流,Header中的Content-Disposition參數(shù)獲取真實(shí)的文件名稱(chēng)。除了這種方式獲取真實(shí)文件名稱(chēng),如代碼所示,還可以通過(guò)表單參數(shù),接收前端表單傳過(guò)來(lái)的文件名稱(chēng)。
文件下載
@GET @Path("/download") @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response download(@QueryParam("fileName") String fileName) { String filePath = "E:\\工作相關(guān)\\" + fileName; File file = FileUtils.getFile(filePath); //對(duì)輸出的文件名進(jìn)行編碼,防止下載的中文文件名亂碼 String encodFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8); return Response.ok(file) .header("content-disposition", "attachment; filename=\"" + encodFileName + "\"") .header("Content-Length", file.length()) .build(); }
相比于文件上傳,文件下載的代碼就更簡(jiǎn)單了,不過(guò)要注意,如果下載的文件名是中文的,最好將文件名使用URLEncoder的UTF-8編碼下,防止中文名稱(chēng)亂碼。
以上就是Quarkus中實(shí)現(xiàn)Resteasy的文件上傳下載操作的詳細(xì)內(nèi)容,更多關(guān)于Quarkus中Resteasy文件上傳下載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
踩坑之spring事務(wù),非事務(wù)方法與事務(wù)方法執(zhí)行相互調(diào)用方式
這篇文章主要介紹了踩坑之spring事務(wù),非事務(wù)方法與事務(wù)方法執(zhí)行相互調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java基于享元模式實(shí)現(xiàn)五子棋游戲功能實(shí)例詳解
這篇文章主要介紹了Java基于享元模式實(shí)現(xiàn)五子棋游戲功能,較為詳細(xì)的分析了享元模式的概念、功能并結(jié)合實(shí)例形式詳細(xì)分析了Java使用享元模式實(shí)現(xiàn)五子棋游戲的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-05-05詳解SpringBoot如何實(shí)現(xiàn)多環(huán)境配置
在實(shí)際的軟件開(kāi)發(fā)過(guò)程中,一個(gè)應(yīng)用程序通常會(huì)有多個(gè)環(huán)境,pring?Boot?提供了一個(gè)非常靈活和強(qiáng)大的方式來(lái)管理這些環(huán)境配置,下面就跟隨小編一起學(xué)習(xí)一下吧2023-07-07Springboot實(shí)現(xiàn)VNC的反向代理功能
這篇文章主要介紹了Springboot實(shí)現(xiàn)VNC的反向代理,搭建過(guò)程也很簡(jiǎn)單,通過(guò)注冊(cè)bean攔截指定URL路徑進(jìn)行自定義操作,具體實(shí)例代碼跟隨小編一起看看需要的朋友可以參考下2021-09-09如何在Spring Boot啟動(dòng)時(shí)運(yùn)行定制的代碼
在本文中您將學(xué)習(xí)如何掛鉤應(yīng)用程序引導(dǎo)程序生命周期并在Spring Boot啟動(dòng)時(shí)執(zhí)行代碼。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12關(guān)于Java父類(lèi)沒(méi)有無(wú)參構(gòu)造方法子類(lèi)處理方法
父類(lèi)無(wú)參構(gòu)造方法,子類(lèi)不寫(xiě),其實(shí)會(huì)默認(rèn)調(diào)用父類(lèi)的無(wú)參構(gòu)造方法也就是用super(),編譯運(yùn)行后,會(huì)打印出"子類(lèi)會(huì)調(diào)用Father的第一個(gè)構(gòu)造方法,這篇文章給大家介紹關(guān)于Java父類(lèi)沒(méi)有無(wú)參構(gòu)造方法子類(lèi)處理方法,感興趣的朋友一起看看吧2024-01-01