You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java从S3 Bucket的.gz压缩文件中提取并下载CSV文件

如何在Java中解压S3存储的.gz文件并返回CSV内容

我来帮你搞定这个问题!你当前的代码直接读取了.gz文件的原始二进制内容,所以返回的是压缩后的乱码数据,自然无法解析成CSV格式。下面是修改后的完整实现方案,帮你顺利完成解压并返回CSV内容:

修改后的代码实现

import java.util.zip.GZIPInputStream;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.apache.commons.io.IOUtils;
import com.amazonaws.services.s3.model.S3Object;

// 你的方法实现
public ResponseEntity<String> downloadAndExtractCsvFromS3() {
    S3Object object = s3Client.getObject("bucket", "Location/file.gz");
    
    // 使用try-with-resources自动关闭流,避免资源泄漏
    try (GZIPInputStream gzipInputStream = new GZIPInputStream(object.getObjectContent())) {
        // 指定UTF-8编码读取解压后的CSV内容,避免乱码
        String csvContent = IOUtils.toString(gzipInputStream, "UTF-8");
        
        // 设置响应头,告诉客户端返回的是CSV格式
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("text/csv"));
        headers.setContentDispositionFormData("attachment", "file.csv"); // 可选:让浏览器直接下载文件
        
        return ResponseEntity.ok()
                .headers(headers)
                .body(csvContent);
    } catch (Exception e) {
        // 根据业务需求处理异常,比如返回错误响应
        e.printStackTrace();
        return ResponseEntity.internalServerError().body("Failed to extract CSV from compressed file");
    }
}

关键要点解释

  • 用GZIPInputStream处理压缩流:你之前直接读取了S3Object的原始输入流,这是压缩后的二进制数据。通过GZIPInputStream包装后,就能自动解压出里面的CSV内容。
  • 自动关闭流:用try-with-resources语法包裹GZIPInputStream,确保流在使用后自动关闭,避免AWS资源泄漏。
  • 明确指定编码:不要用null作为编码参数,明确指定UTF-8可以避免CSV内容出现乱码问题。
  • 设置响应头:添加Content-Type为text/csv,能让客户端正确识别返回的内容格式;如果需要让浏览器直接下载文件,可以加上Content-Disposition头。

额外注意事项

如果你的.gz压缩包中包含多个文件,这个方法只会读取第一个文件的内容。但根据你的描述,压缩包中只有单个CSV文件,所以这个方案完全适用。

内容的提问来源于stack exchange,提问作者Harish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:11:49