首頁 > 軟體

Quarkus中實現Resteasy的檔案上傳下載操作

2022-02-23 13:08:40

前言

做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檔案上傳下載的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com