Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何启动谷歌云存储可恢复上传?_Python_Google App Engine_Google Cloud Storage - Fatal编程技术网

Python 如何启动谷歌云存储可恢复上传?

Python 如何启动谷歌云存储可恢复上传?,python,google-app-engine,google-cloud-storage,Python,Google App Engine,Google Cloud Storage,我试图在后端创建一个GCS可恢复上传url,将其发送到前端,让javascript直接开始一个大文件上传到bucket 我目前的问题是,我不知道如何开始上传 所有的都没有任何代码,所以我没有任何依据 我目前的代码是: def start_resumable_upload(self): API_ENDPOINT = ( 'https://www.googleapis.com/upload/storage/v1beta2/' 'b%(bucket)s/o?up

我试图在后端创建一个GCS可恢复上传url,将其发送到前端,让javascript直接开始一个大文件上传到bucket

我目前的问题是,我不知道如何开始上传

所有的都没有任何代码,所以我没有任何依据

我目前的代码是:

def start_resumable_upload(self):
    API_ENDPOINT = (
        'https://www.googleapis.com/upload/storage/v1beta2/'
        'b%(bucket)s/o?uploadType=resumable&name=%(object_name)s'
    )
    url_params = {
        'bucket': BUCKET,
        'object_name': self.filename
    }
    headers = {
        'X-Upload-Content-Type': self.content_type,
        'X-Upload-Content-Length': 0,
        'Content-Type': 'application/json'
    }
    r = urlfetch.fetch(
        url=API_ENDPOINT % url_params,
        method=urlfetch.POST,
        headers=headers
    )
    return r.content
start_resubable_upload是我创建的文件模型中的一种方法,用于跟踪数据库上的元数据,因此self.filename将具有文件名,content_type将是mime类型,等等

该请求的答复是: 400。那是个错误。 您的客户端发出了格式错误或非法的请求。我们只知道这些

这有点不可接受

非常感谢您的帮助。

这包括一个使用Python进行可恢复上传的示例

关键设置是:

media = MediaFileUpload(filename, chunksize=CHUNKSIZE, resumable=True)
if not media.mimetype():
    media = MediaFileUpload(filename, DEFAULT_MIMETYPE, resumable=True)
request = service.objects().insert(bucket=bucket_name, name=object_name,
                                 media_body=media)
将在使用基于文件的JSON服务帐户密钥进行身份验证后生成已签名的上载URL。然后可以将其返回给客户端,以通过HTTP PUT对上传进行身份验证

import json
import os
from oauth2client.service_account import ServiceAccountCredentials
import httplib2

GCP_CREDENTIALS_FILE = os.getenv('GCP_CREDENTIALS_FILE', 'client-secret.json')
GCS_UPLOAD_URL_PATTERN = 'https://www.googleapis.com/upload/storage'+ \
                         '/v1/b/{bucket}/o?uploadType=resumable'

def get_upload_url(bucket, filename, content_length, content_type='application/octet-stream',):
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        'client-secret.json',
        ('https://www.googleapis.com/auth/devstorage.read_write',),
    )
    http = httplib2.Http()
    credentials.authorize(http)
    url = GCS_UPLOAD_URL_PATTERN.format(bucket=bucket)
    body = json.dumps({
        'name': filename,
    }).encode('UTF-8')
    headers = {
        'X-Upload-Content-Type': content_type,
        'X-Upload-Content-Length': content_length,
        'Content-Type': 'application/json; charset=UTF-8',
        'Content-Length': len(body),
    }
    resp_headers, resp_body = http.request(url, method='POST', headers=headers, body=body)
    return resp_headers['location']

您还可以使用应用程序引擎或计算引擎凭据进行授权。然后,您只需要更改用于生成
凭证
实例的
oauth2client
类。如果要在生产中使用此选项,您还需要添加一些针对凭据问题、网络问题等的错误处理。

您不使用?@jterrace的原因是什么?@jterrace是的,我在文档中没有提到这一点。让我看看如何启动可恢复上传?BUCKET是否有前导“/”?否则,您的URL格式不正确。您还需要对请求进行身份验证:是的,它确实有一个前导,它的/projectname bucketI采用了不同的方法。我使用了签名的URL,更新了GCS CORS,并使用PUT方法上传了带有xhr+Blob的文件。这真是一段旅程。。。