我正在尝试在后端创建一个GCS可恢复上传网址,将其发送到前端以获取javascript以直接将大文件上传到存储桶。
我目前的问题是我无法弄清楚如何开始上传。
所有documentation都没有任何代码,所以我没有任何基础。
我的代码目前是:
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_resumable_upload是我创建的模型中用于跟踪数据库元数据的方法,因此,self.filename将具有文件名,content_type将是mime类型等等。
该请求的回应是:
400。这是一个错误。
您的客户发出了格式错误或非法的请求。我们知道的就这些。
这有些不可接受。
感谢任何帮助。
答案 0 :(得分:4)
此sample application包含使用google-api-python-client在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)
答案 1 :(得分:1)
This function将生成已签名的上载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']
您还可以使用App Engine或Compute Engine凭据进行授权。然后,您只需要更改用于生成oauth2client
实例的credentials
类。如果您打算在生产中使用它,您还需要为凭据问题,网络问题等添加一些错误处理。