如何用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
相关产品推荐
相关产品推荐

