我正在使用Google Javascript客户端API将图像保存到Google云端存储。
云存储需要将put请求发布到其api端点。我从文件输入中读取文件。它是Javascript文件对象的通知。之后,以下代码运行。
var reader = new FileReader();
reader.readAsBinaryString(file);
reader.onload = function (e) {
var base64Data = btoa(e.target.result);
gapi.client.load('storage', 'v1', function () {
var rpcRequest = gapi.client.request({
path: '/upload/storage/v1/b/bucketname/o',
method: 'POST',
params: {
'uploadType': 'resumable',
'name': file.name,
'Expires': <?php echo $this->expires ?>,
'GoogleAccessId': '<?php echo $this->accessid ?>',
'Signature': '<?php echo $this->signature ?>'
},
headers: {
'X-Upload-Content-Type': file.type,
'X-Upload-Content-Length': file.length,
'Content-Type': 'application/json; charset=UTF-8',
},
});
rpcRequest.execute(function (jsonResponse, rawResponse) {
var response = jQuery.parseJSON(rawResponse);
var session_uri = response.gapiRequest.data.headers.location;
initiateUpload(session_uri);
});
function initiateUpload(session_uri){
gapi.client.load('storage', 'v1', function () {
var rpcRequest = gapi.client.request({
path: session_uri,
method: 'PUT',
headers: {
'Content-Length': file.length,
'Content-Type': file.type,
},
body: base64Data,
});
rpcRequest.execute(function (jsonResponse, rawResponse) {
console.log(rawResponse);
});
});
}
});
}
该文件显示在云存储中但已损坏。我开始调试HTTP请求,发现与标准Google上传请求相比,请求的邮件正文不同。以下是请求机构的图片。
我的HTTP PUT REQEST正文:
Google HTTP PUT请求正文
在上面给出的代码中按请求启动的代码是
var rpcRequest = gapi.client.request({
path: session_uri,
method: 'PUT',
headers: {
'Content-Length': file.length,
'Content-Type': file.type,
},
body: base64Data,
});
rpcRequest.execute(function (jsonResponse, rawResponse) {
console.log(rawResponse);
});
我通过读取器读取文件对象然后对其进行编码来处理文件对象
var reader = new FileReader();
reader.readAsBinaryString(file);
reader.onload = function (e) {
// request preparation logic goes here.
}
我做错了什么?
答案 0 :(得分:0)
看起来你是base64编码你上传的数据。这不是必要的。我怀疑存储在GCS中的“损坏”文件是您的实际文件,只有base64编码。