Google云端存储签名URL上传+ Dropzone.js [英] Google Cloud Storage Signed URL Upload + Dropzone.js
问题描述
我正在尝试使用Dropzone.js通过签名URL直接上传到Google Cloud Storage。我已经设法为添加到Dropzone的每个文件覆盖上传URL。 Chrome开发人员工具说正在发生 PUT
请求,但我不可避免地收到HTTP 400错误响应。
I'm trying to use Dropzone.js to upload directly to Google Cloud Storage using a Signed URL. I've managed to override the upload URL for each file added to Dropzone. Chrome dev tools says a PUT
request is occurring but I inevitably receive a HTTP 400 error in response.
这是我的Dropzone.js配置
Here's my Dropzone.js config
Dropzone.options.myAwesomeDropzone = {
url: '/',
uploadMultiple: false,
method: 'PUT',
parallelUploads: 1,
uploadMultiple: false,
header: '',
autoProcessQueue: false,
autoDiscover: false,
maxFiles: 1,
acceptedFiles: 'image/*,video/*',
accept: function(file, done) {
var self = this;
$.post('/api/v1/signed_file_upload', {key: window.apiKey, name: file.name, type: file.type}, function(data) {
if(data.success) {
file.uploadURL = data.data;
done()
setTimeout(function() {
self.processFile(file)
}, 0)
} else {
done(data.message)
}
})
},
init: function() {
var self = this;
this.on('processing', function(file) {
self.options.url = file.uploadURL
})
this.on('sending', function(file, xhr, formData) {
var _send = xhr.send
xhr.send = function() {
_send.call(xhr, file)
}
});
}
};
我的签名URL具有以下结构:
My signed URL has the following structure:
https://www.googleapis.com/upload/storage/v1/b/ {bucket_name} / o / {object_name} .png?GoogleAccessId=xxx@xxx.iam.gserviceaccount.com& amp; Expires = 1521610072& Signature = xxx
Chrome开发工具针对上传请求显示以下内容:
Chrome Dev Tools shows this for the upload request:
我不可避免地会收到HTTP 400响应。有时主体为空,有时会返回JSON对象,显示
I inevitably receive an HTTP 400 response. Sometimes the body is empty and sometimes it returns a JSON object saying
{
"error": {
"errors": [
{
"domain": "global",
"reason": "badContent",
"message": "Unsupported content with type: image/jpeg"
}
],
"code": 400,
"message": "Unsupported content with type: image/jpeg"
}
}
我的签名生成功能是
function storage_url($file_name, $bucket_name = '', $content_type = '', $method = 'PUT', $duration = 3000) {
$expires = time() + $duration;
$signature = '';
$to_sign = ($method . "\n\n" . $content_type . "\n" . $expires . "\n" . '/' . $bucket_name . '/' . $file_name);
$private_key = json_decode(file_get_contents('xxx.json'))->private_key;
if(!openssl_sign( $to_sign, $signature, $private_key, 'sha256' ))
{
return false;
}
else
{
$signature = urlencode(base64_encode($signature));
}
error_log($to_sign);
return 'https://www.googleapis.com/upload/storage/v1/b/' . $bucket_name . '/o/' . urlencode($file_name) .
'?GoogleAccessId=' . 'xxx@xxx.iam.gserviceaccount.com' .
'&Expires=' . $expires .
'&Signature=' . $signature;
}
推荐答案
GCS有两个API。第一个是XML API,它使用诸如 storage.googleapis.com
之类的域。第二个是JSON API,它使用 www.googleapis.com
之类的域。
GCS has two APIs. The first, the XML API, uses domains like storage.googleapis.com
. The second, the JSON API, uses domains like www.googleapis.com
.
您正在使用JSON API,这很好,但不幸的是它不支持签名的URL。使用XML API的格式制作上传网址: https:// cloud.google.com/storage/docs/xml-api/put-object-upload
You're using the JSON API, which is fine, but unfortunately it doesn't support signed URLs. Craft an upload URL using the XML API's format: https://cloud.google.com/storage/docs/xml-api/put-object-upload
这篇关于Google云端存储签名URL上传+ Dropzone.js的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!