Spring Boot开发GCP Bucket文件下载API的前置步骤咨询
Spring Boot集成GCP Bucket文件下载API的前置步骤与细节说明
一、编写下载代码前的前置步骤
- 引入GCP Storage依赖:在Spring Boot项目的构建文件中添加GCP存储服务的启动依赖。以Maven为例,在
pom.xml中加入:<dependency> <groupId>com.google.cloud</groupId> <artifactId>spring-cloud-gcp-starter-storage</artifactId> <version>4.8.0</version> <!-- 版本需适配你的Spring Boot版本 --> </dependency> - 获取GCP服务账号密钥文件:这是后续环境变量配置的核心凭证,操作路径:
- 进入GCP控制台,打开「IAM与管理」→「服务账号」页面
- 创建新服务账号或选择已有账号,为其添加Storage Object Viewer角色(仅需下载权限时)
- 进入该账号的「密钥」标签页,点击「添加密钥」→「创建新密钥」,选择JSON格式下载并保存密钥文件
- 配置环境变量:将
GOOGLE_APPLICATION_CREDENTIALS环境变量的值设置为刚才下载的JSON密钥文件的绝对路径:- Linux/macOS终端执行:
export GOOGLE_APPLICATION_CREDENTIALS="/absolute/path/to/your-key.json" - Windows命令行执行:
set GOOGLE_APPLICATION_CREDENTIALS=C:\absolute\path\to\your-key.json
- Linux/macOS终端执行:
- 验证存储桶权限:确认服务账号拥有目标存储桶的对象读取权限,避免下载时出现权限拒绝错误。
二、GOOGLE_APPLICATION_CREDENTIALS的来源
该环境变量指向的是GCP服务账号的JSON格式密钥文件,获取路径为GCP控制台的「IAM与管理」→「服务账号」页面,通过创建新密钥的方式下载得到,是GCP服务鉴权的核心凭证。
三、设置环境变量后的额外配置
设置完环境变量后,还需要做少量配置以简化控制器开发:
- 初始化Storage客户端配置类:推荐创建一个配置类,通过Spring的
@Bean注解初始化Storage实例,方便控制器注入使用:import com.google.cloud.storage.Storage; import com.google.cloud.storage.StorageOptions; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class GcpStorageConfig { @Bean public Storage storage() { return StorageOptions.getDefaultInstance().getService(); } } - 控制器函数的处理逻辑:控制器中注入Storage实例后,编写下载接口时需处理文件流输出,并设置正确的响应头(确保浏览器能识别下载文件):
注意:这里的import com.google.cloud.storage.Blob; import com.google.cloud.storage.BlobId; import com.google.cloud.storage.Storage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.io.ByteArrayInputStream; import java.io.InputStream; @RestController public class GcpFileDownloadController { @Autowired private Storage storage; @GetMapping("/download/{bucketName}/{filePath}") public ResponseEntity<InputStream> downloadFile(@PathVariable String bucketName, @PathVariable String filePath) { BlobId blobId = BlobId.of(bucketName, filePath); Blob blob = storage.get(blobId); if (blob == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } InputStream fileStream = new ByteArrayInputStream(blob.getContent()); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", blob.getName()); return new ResponseEntity<>(fileStream, headers, HttpStatus.OK); } }filePath是存储桶内的文件相对路径(如示例中的file.txt),无需包含存储桶名称。
内容的提问来源于stack exchange,提问作者QueryQuasar
相关产品推荐
相关产品推荐

