2017-02-01 2 views
0

Ich möchte Upload einer Datei in Google Cloud-Speicher mit Javascript, verwende ich die Google API Javascript.Google Cloud Storage Hochladen nicht autorisiert

Mein Bucket ist nicht öffentlich, ich muss den Zugriff für schreiben konfigurieren, aber der Cloud-Speicher erfordert Authentifizierung.

Ich habe viele Arten der Konfiguration versucht, aber ich weiß wenig über GAE authentifizieren.

Also, wenn ich versuche, um die Datei zu senden, ist die Nachfolge Meldung:

"message": "Anonyme Benutzer nicht storage.objects.create Zugriff haben boti-lab-dev-Korb."

mein Code wie folgt vor:

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

Was ich erstellen oder konfigurieren müssen? Dank

Antwort

0

Die folgenden Arbeiten wie ein Charme für mich:

1/Fügen Sie den folgenden 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; 
} 

wo yourApiScopes gleich

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

2/diese Zeile hinzufügen an der Ende Ihrer HTML-Seite

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

3/Hochladen einer Datei mit der folgenden Funktion:

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

ich es bekam. Ich habe den folgenden Code verwendet:

es funktionierte für mich, ich weiß, dass es nicht gut ist, weil ich einen Token Bearer sende. Ich testete Ihre Lösung und arbeitete auch, danke. Ihre Lösung ist besser, weil Sie API Google verwenden.

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

       } 
      } 
     }; 
    } 
Verwandte Themen