Spring框架中的文件下載功能

文件下載是Web應用程序中常見的功能之一,Spring框架提供了多種方式來進行文件下載,從簡單的文件下載到帶寬控制和流加密的高級下載,Spring框架可以滿足各種需求。本文將詳細介紹Spring框架中的文件下載功能。

一、Spring下載文件流

在Spring框架中,我們可以很容易地使用ResponseEntity類型來下載文件。

示例代碼:

@GetMapping("/download")
public ResponseEntity downloadFile() throws IOException {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentDispositionFormData("attachment", "filename.txt");
    byte[] contents = "This is the content of the file".getBytes();
    return new ResponseEntity(contents, headers, HttpStatus.OK);
}

解釋:

首先,我們通過@GetMapping註解定義了一個/download映射,在該方法中,我們創建了HttpHeaders對象,並設置Content-Type為application/octet-stream,它告訴Web瀏覽器這是一個二進位文件而不是文本文件。之後,我們設置了Content-Disposition標頭,指示瀏覽器將文件下載而不是以其它方式打開它。

最後,我們創建了一個包含文件內容的位元組數組,並使用ResponseEntity返回它。ResponseEntity將承擔整個HTTP響應,因此不僅包含文件內容和標頭,還包含HTTP狀態碼。

二、Spring下載文件帶寬限制

如果您需要限制下載文件的帶寬,請使用StreamingResponseBody和ServletOutputStream。

示例代碼:

@GetMapping("/download")
public void downloadFileWithBandwidthLimit(HttpServletResponse response) throws IOException {
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment; filename=filename.txt");
    InputStream inputStream = new ByteArrayInputStream("This is the content of the file".getBytes());
    ServletOutputStream outputStream = response.getOutputStream();
    byte[] buffer = new byte[1024];
    int bytesRead = -1;
    long totalBytesWritten = 0L;
    long startTime = System.currentTimeMillis();
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        long currentTime = System.currentTimeMillis();
        long timeDiffInMillis = currentTime - startTime;
        long timeDiffInSeconds = TimeUnit.MILLISECONDS.toSeconds(timeDiffInMillis);
        long bytesPerSecond = totalBytesWritten / timeDiffInSeconds;
        if (bytesPerSecond > 1000) {
            try {
                Thread.sleep(1000 - timeDiffInMillis % 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        outputStream.write(buffer, 0, bytesRead);
        totalBytesWritten += bytesRead;
    }
    inputStream.close();
    outputStream.flush();
}

解釋:

在此示例中,我們通過@GetMapping註解定義了一個/download映射,使用StreamingResponseBody和ServletOutputStream實現了帶寬限制的文件下載。

我們使用inputStream指向文件數據,使用outputStream寫入響應的數據。

我們使用位元組數組緩衝數據,每次從輸入流中讀取1024個位元組並將其寫入輸出流中。

我們使用while循環讀取輸入流並寫入輸出流。在每個循環中,我們計算時間差和位元組數,並根據時間差休眠以限制帶寬。

三、Spring下載文件返迴文件流

如果您需要將文件直接返回給用戶而不進行下載,請使用InputStreamResource並設置Content-Type頭和Content-Length頭。

示例代碼:

@GetMapping("/download")
public ResponseEntity downloadFile() throws IOException {
    byte[] contents = "This is the content of the file".getBytes();
    InputStream inputStream = new ByteArrayInputStream(contents);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentLength(contents.length);
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    InputStreamResource resource = new InputStreamResource(inputStream);
    return new ResponseEntity(resource, headers, HttpStatus.OK);
}

解釋:

在此示例中,我們使用@GetMapping註解定義了一個/download映射,使用InputStreamResource將文件返回給用戶。我們使用位元組數組模擬文件內容,並通過ByteArrayInputStream創建一個輸入流。我們使用HttpHeaders來設置Content-Length頭和Content-Type頭。

HttpHeaders對象中的Content-Length頭指定將返回內容的長度。HttpHeaders對象中的Content-Type頭指定要返迴文件的MIME類型。

四、Spring下載文件損壞

在文件下載期間出現錯誤時,可以使用ResponseEntityExceptionHandler處理異常。Spring框架提供了默認異常處理程序ResponseEntityExceptionHandler,可以自定義實現來處理不同類型的異常。

示例代碼:

@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(FileNotFoundException.class)
    public ResponseEntity handleFileNotFound(FileNotFoundException ex) {
        return new ResponseEntity("File not found", HttpStatus.NOT_FOUND);
    }
}

解釋:

在此示例中,我們創建了一個異常處理程序CustomResponseEntityExceptionHandler,繼承了ResponseEntityExceptionHandler,並覆蓋了其中的handleFileNotFound方法來處理FileNotFoundException異常。

此方法返回一個包含錯誤消息的ResponseEntity和一個HTTP狀態碼。

五、Spring下載文件傳給前端

如果您需要將文件傳遞到前端,可以使用@ResponseBody註解和MediaType.APPLICATION_OCTET_STREAM。

示例代碼:

@GetMapping("/download")
@ResponseBody
public byte[] downloadFile() {
    byte[] contents = "This is the content of the file".getBytes();
    return contents;
}

解釋:

在此示例中,我們使用@GetMapping註解定義了一個/download映射,並使用@ResponseBody註解和MediaType.APPLICATION_OCTET_STREAM來將文件傳遞到前端。我們使用位元組數組模擬文件內容,並直接返回它們。

六、SpringBoot 下載文件

Spring Boot提供了自動配置Spring MVC的方式,因此可以使用Spring框架提供的所有文件下載功能。

示例代碼:

@RestController
public class FileDownloadController {
    @GetMapping("/download")
    public ResponseEntity downloadFile() throws IOException {
        // Same as first example
    }
}

解釋:

在此示例中,我們創建了一個FileDownloadController,使用@RestController註解將其標記為RESTful Web服務。我們使用@GetMapping註解定義了一個/download映射,再次使用ResponseEntity類型將文件下載為位元組數組。

七、Spring下載文件內容亂碼

默認情況下,Spring框架將文件視為文本文件並使用默認編碼(UTF-8)對其進行編碼。如果您需要將二進位文件下載為二進位流,請使用ResponseEntity和InputStreamResource。

示例代碼:

@GetMapping("/download")
public ResponseEntity downloadFile() throws IOException {
    byte[] contents = "This is the content of the file".getBytes();
    InputStream inputStream = new ByteArrayInputStream(contents);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentLength(contents.length);
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    InputStreamResource resource = new InputStreamResource(inputStream);
    return ResponseEntity.ok().headers(headers).body(resource);
}

解釋:

在此示例中,我們使用@GetMapping註解定義一個/download映射,使用ResponseEntity和InputStreamResource下載文件。我們使用ByteArrayInputStream創建一個輸入流,並使用HttpHeaders設置Content-Length和Content-Type頭。最後,我們使用ResponseEntity來返回InputStreamResource。

八、Spring下載教程

如果您需要更多的細節,請參閱Spring框架的官方文檔,了解更多有關文件下載的內容。

九、Spring下載安卓版

同樣,您可以在安卓平台上使用Spring框架提供的所有文件下載功能。只需要在安卓應用程序中使用HTTP客戶端來與伺服器進行通信並下載文件。

示例代碼:

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
        .url("http://example.com/file.txt")
        .build();
Response response = client.newCall(request).execute();
InputStream inputStream = response.body().byteStream();

解釋:

在此示例中,我們創建了一個OkHttpClient和一個Request對象,繼而使用HTTP客戶端來下載文件。我們執行execute()方法,返回一個Response對象,並使用byteStream()方法獲得文件的輸入流。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/150719.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-09 02:13
下一篇 2024-11-09 02:14

相關推薦

發表回復

登錄後才能評論