Google Cloud Storage (GCS) 是Google提供的对象存储服务,允许用户存储和检索任意数量的数据。JSON API是GCS提供的RESTful接口,可以通过HTTP请求与之交互。
CloseableHttpClient是Apache HttpClient库中的一个类,用于执行HTTP请求并管理连接资源。
首先需要设置Google Cloud项目并启用GCS API,创建服务账号并获取JSON密钥文件。
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
public class GCSUploader {
private static final String SERVICE_ACCOUNT_EMAIL = "your-service-account@your-project.iam.gserviceaccount.com";
private static final String PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n";
private static final String SCOPE = "https://www.googleapis.com/auth/devstorage.read_write";
private String getAccessToken() throws Exception {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
long now = System.currentTimeMillis() / 1000L;
// 创建JWT声明
JSONObject header = new JSONObject();
header.put("alg", "RS256");
header.put("typ", "JWT");
JSONObject claimSet = new JSONObject();
claimSet.put("iss", SERVICE_ACCOUNT_EMAIL);
claimSet.put("scope", SCOPE);
claimSet.put("aud", "https://oauth2.googleapis.com/token");
claimSet.put("exp", now + 3600);
claimSet.put("iat", now);
// 这里需要实现JWT签名逻辑(使用PRIVATE_KEY)
// 实际项目中建议使用JWT库如jjwt
HttpPost httpPost = new HttpPost("https://oauth2.googleapis.com/token");
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
StringEntity entity = new StringEntity(
"grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=" + signedJwt);
httpPost.setEntity(entity);
// 执行请求并解析响应获取access_token
// ...
}
}
}
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class GCSUploader {
// ... 之前的代码
public void uploadFile(String bucketName, String objectName, File file) throws Exception {
String accessToken = getAccessToken();
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
String url = String.format("https://storage.googleapis.com/upload/storage/v1/b/%s/o?uploadType=media&name=%s",
bucketName, objectName);
HttpPut httpPut = new HttpPut(url);
httpPut.setHeader("Authorization", "Bearer " + accessToken);
httpPut.setHeader("Content-Type", ContentType.APPLICATION_OCTET_STREAM.getMimeType());
FileEntity fileEntity = new FileEntity(file);
httpPut.setEntity(fileEntity);
// 执行请求
try (CloseableHttpResponse response = httpClient.execute(httpPut)) {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
throw new RuntimeException("Upload failed with status code: " + statusCode);
}
// 处理成功响应
}
}
}
}
原因:
解决:
原因:
解决:
原因:
解决:
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.json.JSONObject;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class GCSUploadExample {
public static void main(String[] args) {
try {
GCSUploader uploader = new GCSUploader();
File fileToUpload = new File("path/to/your/file.txt");
uploader.uploadFile("your-bucket-name", "destination-object-name", fileToUpload);
System.out.println("File uploaded successfully");
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:实际项目中应考虑使用Google官方Java客户端库简化开发,此示例展示了底层API的使用方式。
没有搜到相关的文章