在HTTP请求正文中发送图像

时间:2016-03-14 09:03:38

标签: http google-cloud-storage

我正在使用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正文:

enter image description here

Google HTTP PUT请求正文

enter image description here

在上面给出的代码中按请求启动的代码是

                        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.
        }

我做错了什么?

1 个答案:

答案 0 :(得分:0)

看起来你是base64编码你上传的数据。这不是必要的。我怀疑存储在GCS中的“损坏”文件是您的实际文件,只有base64编码。