Загрузить в облачный магазин Google, используя json api из javascript

Я пытаюсь использовать 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 вызов или даже печать любой ошибки и т. д.

Я не уверен, что здесь не так. пожалуйста, порекомендуйте

1 ответ

Вы не можете загружать файлы в хранилище Google, используя только ключ API. У вас должен быть жетон Oauth.

Если для запроса требуется авторизация (например, запрос личных данных пользователя), приложение должно предоставить токен OAuth 2.0 вместе с запросом. Приложение может также предоставить ключ API, но это не обязательно.

Если для запроса не требуется авторизация (например, запрос на общедоступные данные), приложение должно предоставить либо ключ API, либо токен OAuth 2.0, либо и то и другое - любой вариант, который вам наиболее удобен.

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

В вашем случае вы хотите загрузить файл, поэтому у вас должен быть токен oauth.

У вас есть несколько обходных путей:

  • Вы можете загрузить файл на свой сервер и загрузить его, используя свои учетные данные на сервере, используя учетную запись службы.
    https://cloud.google.com/compute/docs/access/service-accounts

  • Вы можете создать токен на своем сервере и отправить его своему клиенту. Затем клиент может загрузить один файл в вашу учетную запись Google Storage без маркера постоянного доступа.

  • Вы можете загрузить в учетную запись Google Storage ваших пользователей. Для этого они должны войти в ваше приложение. https://developers.google.com/identity/protocols/OAuth2

  • Последний способ заключается в том, что вы можете загрузить файлы на свой сервер и скопировать их в облако, выполнив gutil mv команда. В этом случае все, что вам нужно сделать, это один раз войти в свою облачную учетную запись Google, используя gcloud auth gustil mv, gcloud mv command

Подробнее о gcloud утилиту и загрузить ее: https://cloud.google.com/sdk/

Другие вопросы по тегам