2017-02-01 9 views
0

Я хотел бы загрузить файл в облако хранилища Google с помощью javascript, я использую javascript google api.Google Cloud Storage Upload неавторизованный

Мое ведро не является общедоступным, мне нужно настроить доступ для записи, но облачное хранилище требует аутентификации.

Я пробовал много типа конфигурации, но я знаю, что об аутентификации GAE.

Так что, когда я пытаюсь отправить файл, сообщение следует за шоу:

«сообщение»: «Анонимные пользователи не имеет доступа к storage.objects.create ведра Бота-LAB-DEV.»

Следуйте мой код:

function start() { 
    // 2. Initialize the JavaScript client library. 
    gapi.client.init({ 
    'apiKey': 'myApiKey', 
    // clientId and scope are optional if auth is not required. 
    'clientId': 'xxxbug.apps.googleusercontent.com', 
    'scope': 'https://www.googleapis.com/auth/devstorage.read_write', 

    }).then(function() { 
    // 3. Initialize and make the API request. 
    return gapi.client.request({ 
     'method': 'post', 
     'path': 'https://www.googleapis.com/upload/storage/v1/b/myBucket/o?uploadType=media&name=nameOfFile', 
     'header': { 
      'Authorization': 'Bearer ya29.mykey' 
     } 
    }) 
    }).then(function(response) { 
    console.log(response.result); 
    }, function(reason) { 
    console.log('Error: ' + reason.result.error.message); 
    }); 
}; 
// 1. Load the JavaScript client library. 
gapi.load('client', start); 

Что мне нужно создать или настроить? Благодаря

ответ

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 
     } 

    }; 

} 
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); 

       } 
      } 
     }; 
    } 
Смежные вопросы