Quarkus中實現Resteasy的文件上傳下載操作
前言
做java web開發,文件的上傳和下載是一個非常常見的需求場景。在spring生態下的文件上傳下載非常簡單,記得五年前,我剛寫博的時候也寫過spring的上傳和下載《SpringMvc實現文件上傳與下載》,以及Struts2的文件上傳和下載《java Struts2實現文件上傳下載》。今天來看看Quarkus框架中是如何實現的,因為Quarkus的JAX-RS采用Resteasy的實現,故Quarkus中的文件上傳和下載,也就是Resteasy框架的上傳和下載瞭。
Resteasy文檔:https://docs.jboss.org/resteasy/docs/4.3.1.Final/
文件上傳
首先引入依賴
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-multipart-provider</artifactId> </dependency>
這個依賴主要用於支持multipart/form-data的請求,接下來需要定義一個接收multipart/form-data表單數據的實體類,如下:
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; } }
以上代碼用來映射表單中的屬性值,除瞭文件流,隻支持字符串類型的屬性。其中file字段用來接收上傳的文件,除瞭可以用InputPart類型來接收,上傳文件還可以使用InputStream、byte[]、File等接收,這裡使用InputPart來接收是為瞭方便接下來從Header參數裡獲取文件名,如:
@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("上傳文件內容:{}", IOUtils.toString(i, StandardCharsets.UTF_8)); return Response.ok("ok").build(); }
InputPart實體承載瞭文件流,以及請求體信息,可以通過getBody來獲取文件流,Header中的Content-Disposition參數獲取真實的文件名稱。除瞭這種方式獲取真實文件名稱,如代碼所示,還可以通過表單參數,接收前端表單傳過來的文件名稱。
文件下載
@GET @Path("/download") @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response download(@QueryParam("fileName") String fileName) { String filePath = "E:\\工作相關\\" + fileName; File file = FileUtils.getFile(filePath); //對輸出的文件名進行編碼,防止下載的中文文件名亂碼 String encodFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8); return Response.ok(file) .header("content-disposition", "attachment; filename=\"" + encodFileName + "\"") .header("Content-Length", file.length()) .build(); }
相比於文件上傳,文件下載的代碼就更簡單瞭,不過要註意,如果下載的文件名是中文的,最好將文件名使用URLEncoder的UTF-8編碼下,防止中文名稱亂碼。
以上就是Quarkus中實現Resteasy的文件上傳下載操作的詳細內容,更多關於Quarkus中Resteasy文件上傳下載的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- springboot中Excel文件下載踩坑大全
- Java下載文件的四種方式詳細代碼
- php文件下載後無法打開的處理方案及代碼
- 如何解決springmvc文件下載,內容損壞的問題
- Springboot導出文件,前端下載文件方式