如何使用谷歌 Cloud Storage作为项目的图片存储服务
在使用Cloud Storage服务之前,需要在谷歌项目中创建服务账号
创建服务账号
1.在控制台中打开导航菜单——API和服务——凭据页面
2.点击创建凭据——服务账号
3.填写服务账号信息
我们为服务账号添加默认Owner角色权限
这里填写你自己的谷歌账号,也就是可以用你自己的谷歌账号可以对该服务账号进行修改权限等操作
创建服务账号以后,下一步就要为服务账号创建密钥了,密钥是我们访问Cloud Storage的API的凭据
为服务账号创建json密钥
上一步创建服务账号后,在服务账号的页面就可以看到新创建的服务账号了,这里我们点击该服务账号的——管理密钥
进入密钥管理页面后,我们点击 添加密钥——创建新密钥
点击创建后,就会创建json格式的密钥了,并且也会自动将密钥下载到我们的本机
Cloud Storage控制台创建存储桶
存储桶是作为存放我们的文件的容器,我们所有的文件上传成功后都会在我们创建的存储桶容器中
1.创建存储桶
这里要注意,数据存储位置和默认存储类别将影响访问速度,要根据提示选择适合自己项目的位置和存储类别
2.修改存储桶的访问权限
进入存储桶的详情,在权限页面,要修改该存储桶的访问权限,首先设置存储桶为“公开访问”状态和“精细控制”状态,第二要添加“allUsers”账号,并且权限设置为Storage Legacy Object Reader 和 Storage Object Viewer, 表示任何人都拥有存储桶的查看权限和里边单个文件的查看权限
写Demo进行测试
这里我们使用java进行操作,写一个最常用的图片上传和访问的功能
1.第一步我们要做的是先引入Google Cloud Storage的相关依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
<version>22.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
</dependency>
</dependencies>
下面是详细代码:
package com.google.test;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.storage.*;
import com.google.common.collect.Lists;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class GoogleFileUtil {
public static void main(String[] args) throws IOException {
String filepath = uploadFile("测试", "vue_jinbeiwallet_com");
System.out.println("公开访问地址是::::" + filepath);
}
public static String uploadFile(String fileName,String bucketName) throws IOException {
//要上传的本地文件的绝对路径
String filePath = "D:/imgs/wallhaven/钻石/1krllv.jpg";
//读取本地存储的服务账号的json密钥,拿到该服务账号的权限
GoogleCredentials credentials= GoogleCredentials.fromStream(new FileInputStream("D:/tity/linear-stock-325210-33d0c8edd2cc.json"))
.createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
//创建服务账号对应的操作对象
Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
// 将本地指定路径的文件转换为字节
byte[] bytes = Files.readAllBytes(Paths.get(filePath));
//上传文件图片到指定的存储桶中
BlobId blobId=BlobId.of(bucketName,fileName);
BlobInfo blobInfo=BlobInfo.newBuilder(blobId).build();
Blob blob = storage.create(blobInfo, bytes);
//修改已经上传的文件类型为 image/jpg
blob.toBuilder().setContentType("image/jpg").build().update();
//返回公开访问的地址
return "https://storage.googleapis.com/" + bucketName + "/" + fileName;
}
}
以上代码需要注意的是,第一个是本地存放json密钥的绝对路径,在liunx系统上写法跟windows不一样,需要修改
第二是需要修改上传后的文件类型,要根据自己上传文件的类型进行修改,如果不修改,默认都是application/octet-stream,,这样的话访问公开地址就会变成下载地址
下面我们来看一下运行结果:
成功上传并且生成公开访问地址,在实际运用中,我们一般会将该访问地址入库,在前端需要的时候请求并返回该地址就好了