javascript - 在浏览器上使用 javascript 在 Google API 上发送 post 请求

标签 javascript jquery ajax node.js reactjs

我在 Google API 中的 $.ajax 请求收到 404 错误。 我有这些代码,

var asyncLoad = require('react-async-loader');
var CLIENT_ID = '<SOME_ID>';
var DISCOVERY_DOCS = ["https://www.googleapis.com/discovery/v1/apis/drive/v3/rest"];
  var SCOPES = 'https://www.googleapis.com/auth/drive';

const mapScriptToProps = state => ({
   gapi: {
     globalPath: 'gapi',
     url: 'https://apis.google.com/js/api.js'
   }
});

@asyncLoad(mapScriptToProps)
...

我使用react的异步加载器在bundle.js之前获取Google API。 然后我得到属性中的gapi。这是我提交表单的下一个代码。

submitForm(e){
e.preventDefault();
var data = this.refs.file.files[0];
var self = this;
var formData = new FormData();
formData.append('data', data); 
$.ajax({
    url: "https://www.googleapis.com/upload/drive/v3?uploadType=media&access_token="+encodeURIComponent(self.state.token),
    type: "POST",
    processData: false,
    data: formData,
    beforeSend: function (xhr) {
      /* Authorization header */
      xhr.setRequestHeader("Authorization", "Bearer " + self.state.token);
      xhr.setRequestHeader('X-Upload-Content-Length', data.size);
      xhr.setRequestHeader("Content-Type", "image/jpeg");
      xhr.setRequestHeader('X-Upload-Content-Type', "image/jpeg");
  },
    success: function(data){
        if(typeof data === "string") data = JSON.parse(data);
        console.log(data);
        if(data.success){
            console.log("done");
        }else {
            console.log("error");
        }
    }
});

}

所以在这里,我在单击按钮上传时调用submitForm函数。我还使用 ref="file" 输入文件。这是在客户端(浏览器)端运行的。我收到 404 错误。

我在这里想做的是将图像文件上传到谷歌驱动器。我怎样才能正确地做到这一点?我的问题有什么解决办法吗?

最佳答案

404错误是由于url缺少files引起的部分:https://www.googleapis.com/upload/drive/v3/files?uploadType=media 。请参阅Google Drive APIs > REST - Files: create .

我成功上传了从 <input type="file" accept="image/*"> 读取的图像与 FileReader.readAsDataURL()方法如下:

var metadata = {
    name: 'image.jpg',
    mimeType: 'image/jpeg'
}

var user = gapi.auth2.getAuthInstance().currentUser.get();
var oauthToken = user.getAuthResponse(true).access_token;

var boundary = 'foo_bar_baz';
var data = '--' + boundary + '\n';
data += 'content-type: application/json; charset=UTF-8' + '\n\n';
data += JSON.stringify(metadata) + '\n';
data += '--' + boundary + '\n';

var dataURL = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAZAAA/+EKhWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZ...'
var dataURLparts = dataURL.split(',', 2);
var dataURLheaderParts = dataURLparts[0].split(':');
var dataURLheaderPayloadParts = dataURLheaderParts[1].split(';');

data += 'content-transfer-encoding: ' + dataURLheaderPayloadParts[1] + '\n';
data += 'content-type: ' + dataURLheaderPayloadParts[0] + '\n\n';
data += dataURLparts[1] + '\n';
data += '--' + boundary + '--';

$.ajax({
    type: 'POST',
    url: 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',
    beforeSend: function (xhr) {
        xhr.setRequestHeader("Authorization", "Bearer " + oauthToken);
     },
     contentType: 'multipart/related; boundary=' + boundary,
     data: data,
     processData: false
 }).done(function(response) {
     console.log(response);
 });

关于javascript - 在浏览器上使用 javascript 在 Google API 上发送 post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42685540/

相关文章:

javascript - QtQuick2-QML-创建无限动线动画

javascript - 单击选项卡无法准确工作

javascript - 如何在iframe head中添加div标签

jQuery 结合多个函数以实现更简洁的编码

jquery - 我如何定位 jquery 或 css 中的下一个或同级元素?

javascript - Ajax window.location 不适用于 PHP 登录脚本

javascript - 为 TFS SOAP web 服务构建 javascript 客户端

javascript - angularjs:如何在单元测试中模拟 $rootScope

javascript - 如何使用 Rails 从数字字段执行 jQuery ajax 调用

jquery - 检索 HTTP header token