Google Cloud Storage未经授权上传

时间:2017-02-01 01:11:03

标签: google-cloud-storage google-cloud-endpoints

我想使用javascript将文件上传到谷歌云端存储,我正在使用google api javascript。

我的存储桶不公开,我需要配置写入访问权限,但云存储需要进行身份验证。

我尝试了很多类型的配置,但我知道有关GAE身份验证的问题。

因此,当我尝试发送文件时,显示以下消息:

“message”:“匿名用户没有storage.objects.create访问存储桶boti-lab-dev。”

按照我的代码:

outer

我需要创建或配置什么? 感谢

2 个答案:

答案 0 :(得分:0)

以下作品对我来说很有魅力:

1 /添加以下javascript:

function init() {
    gapi.client.setApiKey(yourApiKey);
    window.setTimeout(checkAuth, 1);
}

function checkAuth() {
    gapi.auth.authorize({
        client_id: yourClientId,
        scope: yourApiScopes,
        immediate: true
    }, handleAuthResult);
}

function handleAuthResult(authResult) {
    if (authResult && !authResult.error) {
         //do something
    } else {

        $("#loginButton").click(function () {
            handleAuthClick();
        });

    }
}

function handleAuthClick() {
    gapi.auth.authorize({
        client_id: yourClientId,
        scope: yourApiScopes,
        immediate: false
    }, handleAuthResult);
    return false;
}

yourApiScopes等于

"email https://www.googleapis.com/auth/devstorage.read_write"

2 /在HTML网页末尾添加此行

<script src="https://apis.google.com/js/client.js?onload=init"></script>

3 /使用以下功能上传文件:

function uploadFile(fileData, bucket) {
    var boundary = '-------314159265358979323846';
    var delimiter = "\r\n--" + boundary + "\r\n";
    var close_delim = "\r\n--" + boundary + "--";
    var reader = new FileReader();
    reader.readAsBinaryString(fileData);

    reader.onload = function (e) {
        var contentType = fileData.type || 'application/octet-stream';
        var metadata = {
            'name': fileData.name,
            'mimeType': contentType
        };
        var base64Data = btoa(reader.result);
        var multipartRequestBody =
                delimiter +
                'Content-Type: application/json\r\n\r\n' +
                JSON.stringify(metadata) +
                delimiter +
                'Content-Type: ' + contentType + '\r\n' +
                'Content-Transfer-Encoding: base64\r\n' +
                '\r\n' +
                base64Data +
                close_delim;

        var request = gapi.client.request({
            'path': '/upload/storage/v1/b/' + bucket + '/o',
            'method': 'POST',
            'params': {'uploadType': 'multipart'},
            'headers': {
                'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
            },
            'body': multipartRequestBody
        });

        try {
            request.execute(function (resp) {
                if (resp.hasOwnProperty("error")) {
                    //do something for error
                } else {
                   //do something for success
                    }
                }
            });
        }
        catch (e) {
           //do something
        }

    };

}

答案 1 :(得分:0)

我明白了。 我使用下面的代码:

它对我有用,我知道它不好,因为我正在发送一个令牌持有者。 我测试了你的解决方案并且也工作了,谢谢。 你的解决方案更好,因为你使用的是api google。

function sentStorage(token, bucket, x-goog-project-id) {
       var file =  document.getElementById("myFile").files[0];
       var url = 'https://www.googleapis.com/upload/storage/v1/b/'
       url += bucket + o?uploadType=media&name=' + file;
       xhr = new XMLHttpRequest();

       xhr.open('POST', url);
       xhr.setRequestHeader('Content-Type', file.type);

       xhr.setRequestHeader('x-goog-project-id', x-goog-project-id);
       xhr.setRequestHeader('Authorization', 'Bearer ' + token);

       xhr.send(file);

       xhr.onreadystatechange = function () {
           if (xhr.readyState === 4) {
               var response = JSON.parse(xhr.responseText);
               if (xhr.status === 200) {
                   alert('codigo 200');
               } else {
                 var message = 'Error: ' + response.error.message;
                 console.log(message);
                   alert(message);

               }
           }
       };
   }