使用JSON API和JavaScript上传到Google Cloud存储

7

我正在尝试使用gapi将图像上传到Google云存储。目前我的代码是这样的:

<script src="https://apis.google.com/js/api.js"></script>
<script type="text/javascript">
var imgData = null;

function getImage() {
    navigator.camera.getPicture(onSuccess, onFailure, {
        destinationType: navigator.camera.DestinationType.FILE_URI,
        sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY
    });

    function onSuccess(imageURI) {
        imgData = encodeImageUri(imageURI);
        var contentLen = imgData.length;
        gapi.load('client', start);
    }

    function onFailure(message) {
        alert("Get image failed: " + message);
    }
}

function start() {
    // 2. Initialize the JavaScript client library.
    console.log('firing google storage api');
    gapi.client.init({
        'apiKey': 'XXX-XX'
    }).then(function() {
        // 3. Initialize and make the API request.
        console.log('api initialized');
        var request = gapi.client.request({
            'path': 'https://www.googleapis.com/upload/storage/v1/b/visionapibucket/o?uploadType=media&name=myObject',
            'method': 'POST',
            'headers': {
                'Content-Type': 'image/jpeg'
            },
            'body': imgData
        });

        try {
            //Execute the insert object request
            console.log('executing call');
            request.execute(function(resp) {
                alert(resp);
            });

        } catch (e) {
            console.log('An error has occurred: ' + e.message);
        }
    }).then(function(response) {
        console.log(response.result);
    }, function(reason) {
        console.log('Error: ' + reason.result.error.message);
    });
};
</script>

我可以看到代码在控制台中触发了语句:api initialized

但是我没有看到gapi.client.request调用或打印任何错误信息等

我不确定出了什么问题,请指导。


我对这个 google api 不是很了解,但我可以告诉你一件事情,gapi.client.request参数pathmethodparamsheaderbody,如此文档所述 here,请在您纠正后发送您的输入。 - Pritish Vaidya
只需要路径,其他都是可选的。 - Vik
没有帮助。我在问题中更新了我的代码。 - Vik
1
你能把 gapi.client.request 放进 try 里面,看看这个语句是否会抛出异常吗?此外,你那边能否访问到这个网站(https://www.googleapis.com/)? - zhm
尝试移动没有成功。在控制台日志中,它仍然打印“正在执行调用”的消息,之后什么也没有。 - Vik
显示剩余3条评论
1个回答

1
你不能仅使用API密钥上传文件到Google存储。你必须拥有一个oauth令牌。
如果请求需要授权(例如请求个人隐私数据),则应用程序必须提供OAuth 2.0令牌。应用程序也可以提供API密钥,但不必要。
如果请求不需要授权(例如请求公共数据),则应用程序必须提供API密钥或OAuth 2.0令牌,或者两者都提供——无论哪种选项对您最方便。

https://cloud.google.com/storage/docs/json_api/v1/how-tos/authorizing

在您的情况下,您想要上传文件,因此必须拥有OAuth Token。 您有几种解决方法:
  • 您可以将文件上传到您的服务器,并使用服务帐户使用您的服务器凭据进行上传。
    https://cloud.google.com/compute/docs/access/service-accounts

  • 您可以在服务器上创建令牌,并将其发送给客户端。然后,客户端可以上传一个文件到您的Google Storage帐户,而无需永久访问令牌。

  • 您可以上传到您用户的Google Storage帐户。为此,他们必须登录到您的应用程序。 https://developers.google.com/identity/protocols/OAuth2

  • 最后一种方法是,您可以将文件上传到您的服务器,并通过执行gutil mv命令将其复制到云中。在这种情况下,您只需要使用gcloud auth一次登录到您的Google Cloud帐户即可。 gustil mv, gcloud mv command

更多关于gcloud实用程序的信息,以及下载它的链接:https://cloud.google.com/sdk/


我同意你上面所说的,但我的问题是,即使调用没有发生,我也应该看到一个认证错误或权限错误,不是吗? - Vik
@Aminadav,您能提供一下您提到的“您可以在服务器上创建一个令牌并将其发送到客户端。然后,客户端可以上传一个文件到您的Google存储帐户,而无需永久访问令牌”的示例代码吗? - sungyong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接