首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現文件上傳下載與圖片壓縮完整指南

     編輯:Java 相關知識

概述

文件上傳下載是 Web 開發基礎功能,圖片壓縮則關鍵於存儲成本與傳輸性能。本文提供基於 Servlet/JSP 及 Spring Boot 的完整實現方案,涵蓋多部分解析、流式處理、圖片縮放壓縮等核心技術。

文件上傳核心實現

1. 依賴與配置

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

Spring Boot 配置:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB

2. Controller 處理上傳

@PostMapping("/upload")
public ResponseEntity upload(@RequestParam("file") MultipartFile file) {
    if (file.isEmpty()) return ResponseEntity.badRequest().body("文件為空");
    try {
        String originalName = file.getOriginalFilename();
        String savedName = UUID.randomUUID() + "_" + originalName;
        Path savePath = Paths.get(UPLOAD_DIR, savedName);
        Files.copy(file.getInputStream(), savePath, StandardCopyOption.REPLACE_EXISTING);
        return ResponseEntity.ok("上傳成功:" + savedName);
    } catch (IOException e) {
        log.error("上傳失敗", e);
        return ResponseEntity.status(500).body("上傳異常");
    }
}

文件下載實現

@GetMapping("/download/{fileName}")
public void download(@PathVariable String fileName, HttpServletResponse response) {
    Path filePath = Paths.get(UPLOAD_DIR, fileName);
    if (!Files.exists(filePath)) {
        response.setStatus(404);
        return;
    }
    response.setContentType(Files.probeContentType(filePath));
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
    try (InputStream in = Files.newInputStream(filePath);
         OutputStream out = response.getOutputStream()) {
        IOUtils.copy(in, out);
    } catch (IOException e) {
        log.error("下載失敗", e);
    }
}

圖片壓縮與縮放

使用 Thumbnailator 庫(簡潔高效):

<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.18</version>
</dependency>
public byte[] compressImage(byte[] original, float quality, int maxWidth, int maxHeight) throws IOException {
    try (ByteArrayInputStream in = new ByteArrayInputStream(original);
         ByteArrayOutputStream out = new ByteArrayOutputStream()) {
        Thumbnails.of(in)
            .scale(1.0) // 保持原比例
            .size(maxWidth, maxHeight) // 限制最大尺寸
            .outputQuality(quality) // 壓縮質量 0.0-1.0
            .toOutputStream(out);
        return out.toByteArray();
    }
}

或使用原生 ImageIO 實現無依賴壓縮。

最佳實踐建議

  • 流式處理:大文件避免全量讀入內存,使用 Files.copy / IOUtils.copyLarge。
  • 安全校驗:檢查文件類型(Magic Number)、大小、文件名過濾(防止路徑遍歷)。
  • 異步處理:大文件/耗時壓縮放入異步任務隊列(如 CompletableFuture、消息隊列)。
  • 分佈式存儲:生產環境對接 MinIO、S3、OSS 等對象存儲,而非本地磁盤。

總結

掌握 Multipart 解析、流式 IO、圖片處理庫的使用,即可構建健壯的文件服務。記住:安全第一,流式第二,異步第三。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved