当前位置: 首页 > 知识库问答 >
问题:

如何使用App Engine上的Google Client Library for Java创建Google云存储可恢复上传URL?

柴耀
2023-03-14

我找到了下面的便条,它准确地描述了我想做的事情:

注意:如果您的用户只是将资源上载(写入)到访问控制的存储桶,您可以使用Google云存储的可恢复上传功能,并避免签署URL或要求Google帐户。在可恢复上传场景中,您的(服务器端)代码进行身份验证并启动上载到Google云存储,而无需实际上载任何数据。启动请求返回一个上传ID,然后可以在客户端请求中使用该ID来上传数据。客户端请求不需要签名,因为上传ID实际上充当身份验证令牌。如果选择此路径,请确保通过HTTPS传输上传ID。

https://cloud.google.com/storage/docs/access-control#Signed-网址

然而,我不知道如何使用Google Cloud Storage Library for Java实现这一点。

https://developers.google.com/resources/api-libraries/documentation/storage/v1/java/latest/

在这个API中,我找不到任何关于可恢复文件的引用,也找不到文件的URL。我该怎么做?

共有3个答案

白腾
2023-03-14

这需要一些挖掘,但我想出了以下正确的方法。一些关于如何做到这一点的官方文档会很好,尤其是因为实际触发可恢复上传的endpoint与文档中所说的不同。这里的内容来自于使用gsutil工具对请求进行签名,然后确定正在做什么。文档不足的另一件事是,发布到此URL以获取可恢复会话URL的代码必须包含“x-goog-resumable:start”头以触发上载。从那以后,一切都和执行可恢复上传到地面军事系统的文件一样。

import base64
import datetime
import time
import urllib

from google.appengine.api import app_identity

SIGNED_URL_EXPIRATION = datetime.timedelta(days=7)

def SignResumableUploadUrl(gcs_resource_path):
  """Generates a signed resumable upload URL.

  Note that documentation on this ability is sketchy. The canonical source
  is derived from running the gsutil program to generate a RESUMABLE URL
  with the "-m RESUMABLE" argument. Run "gsutil help signurl" for info and
  the following for an example:
    gsutil -m RESUMABLE -d 10m keyfile gs://bucket/file/name

  Note that this generates a URL different from the standard mechanism for
  deriving a resumable start URL and the initiator needs to add the header:
    x-goog-resumable:start

  Args:
    gcs_resource_path: The path of the GCS resource, including bucket name.

  Returns:
    A full signed URL.
  """
  method = "POST"
  expiration = datetime.datetime.utcnow() + SIGNED_URL_EXPIRATION
  expiration = int(time.mktime(expiration.timetuple()))
  signature_string = "\n".join([
      method,
      "",  # content md5
      "",  # content type
      str(expiration),
      "x-goog-resumable:start",
      gcs_resource_path
  ])
  _, signature_bytes = app_identity.sign_blob(signature_string)
  signature = base64.b64encode(signature_bytes)

  query_params = {
      "GoogleAccessId": app_identity.get_service_account_name(),
      "Expires": str(expiration),
      "Signature": signature,
  }

  return "{endpoint}{resource}?{querystring}".format(
      endpoint="https://storage.googleapis.com",
      resource=gcs_resource_path,
      querystring=urllib.urlencode(query_params))
黄英韶
2023-03-14

你可以自己创建url。下面是一个例子:

OkHttpClient client = new OkHttpClient();
AppIdentityService appIdentityService = credential.getAppIdentityService();
Collection<String> scopes = credential.getScopes();
String accessToken = appIdentityService.getAccessToken(scopes).getAccessToken();
Request request = new Request.Builder()
        .url("https://www.googleapis.com/upload/storage/v1/b/" + bucket + "/o?name=" + fileName + "&uploadType=resumable")
        .post(RequestBody.create(MediaType.parse(mimeType), new byte[0]))
        .addHeader("X-Upload-Content-Type", mimeType)
        .addHeader("X-Upload-Content-Length", "" + length)
        .addHeader("Origin", "http://localhost:8080")
        .addHeader("Origin", "*")
        .addHeader("authorization", "Bearer "+accessToken)
        .build();
Response response = client.newCall(request).execute();
return response.header("location");
颜骁
2023-03-14

该库不会向调用方公开它创建的URL,这意味着您不能使用它来完成此任务。如果您想使用签名URL或您上面提到的技巧,您需要手动实现它。

如果可能的话,我建议使用签名网址解决方案,而不是服务器初始化可恢复上传的解决方案。它更灵活,更容易正确操作,后一种方法可能会遇到一些奇怪的边缘情况。

不久前,有人在另一个问题上写了一个从App Engine上签署URL的快速示例:App Engine上的云存储和安全下载策略。GCS acl或blobstore

 类似资料:
  • 我试图在vue js中构建镜像上传器,我希望它可以恢复上传,我从浏览器直接将请求发送到云存储服务器(例如,不使用php作为发送上传请求的中间件) 但是文档说我必须有访问令牌才能获取会话url,我稍后将使用它来上传图像,如何使用JavaScript获取此访问令牌,谷歌云没有javascript库,但在我不能用于浏览器使用的节点js中 邮递https://www.googleapis.com/uplo

  • 我试图链接PHP文件在谷歌云存储,但得到他们作为纯文本。我想连接到其他文件,但没有应用程序引擎,这是专门为应用程序引擎写的所有留档,甚至找不到桶存储是否有PHP支持,即使它应该。任何线索如何链接PHP文件正确的云存储?

  • 我正在测试Android的驱动器API,以便上传一个文件,该文件可以显示上传的进度,并能够在失败时恢复上传(文件大小>30 MB) 与以下问题:上传下载的大文件到谷歌驱动器给错误,上传进度监听器没有激发(谷歌驱动器API)我能够得到上传进度,他们提到那些是可恢复的上传。但是,我没有看到任何寻找上传错误和恢复逻辑的代码,因此,如果我杀死应用程序并“恢复”上传,它只是从头开始。

  • 我正试着上传一张照片,在被croppie剪切到GCS之后。gcs write(imageToUpload)方法失败,因为imageToUpload当前不是文件,而是Blob。有没有人知道一个办法让这件事成功?可能是python中一种将BLOB转换为文件的方法吗?可以从Croppie返回的图像类型有:1)画布,2)HTML,3)BLOB和4)Base64这里是文档(Ctrl-F“result”)。任

  • 我是一个python开发人员。我们使用GCS(Google cloud storage)来存储我们过去几个月的图像,这很好,但对于android来说,它需要将所有桶导入Firebase cloud storage(FCS)来访问它。我们不想要任何手动集成。我们听说,如果我们在FCS上创建一个bucket,自动反映到GCS,这是好的,不需要导入。 我们试图直接在firebase云存储上创建bucke

  • 我有一个firebase帐户,我想以编程方式上传一些照片到firebase存储。为此,我使用了google cloud java storage API。我配置权限和其他权限。我可以成功地创建桶,斑点。然而,当我试图上传一张图片时,要么它的大小为0,要么它无法下载(不生成URL)。下面是我使用的代码; 任何建议都很感激。问候。