我找到了下面的便条,它准确地描述了我想做的事情:
注意:如果您的用户只是将资源上载(写入)到访问控制的存储桶,您可以使用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。我该怎么做?
这需要一些挖掘,但我想出了以下正确的方法。一些关于如何做到这一点的官方文档会很好,尤其是因为实际触发可恢复上传的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))
你可以自己创建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");
该库不会向调用方公开它创建的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)。下面是我使用的代码; 任何建议都很感激。问候。