2014-11-07 15 views
12

Za pomocą następującego kodu mogę przesłać do mojego publicznie zapisywalnego zasobnika w chmurze Google Cloud Storage. (allUsers ma uprawnienia do zapisu). Jednak jeśli wiadro nie jest publicznie zapisywalne, otrzymuję 401 nieautoryzowany błąd. (Nie chcę, żeby wiadro było publicznie zapisywane).przesłać do podpisanego adresu URL w chmurze do zapisywania w chmurze za pomocą javascript

var file = $scope.myFile; 
     var fileData = file; 
     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': 'objectName', //'lol' + 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 stuff = angular.fromJson('{"Expires": "1415344534", "GoogleAccessId": "3940[email protected]unt.com", "Signature": "AMkhO7mt2zg+s1Dzx28yQIMSrZlDC2Xx1SzvMCAgUVyiLXs5890/nA6PKzoc1KYBcRv/ALmkNaEVhvWHxE0EfcE151c0PYSG9x7AeSpQI/3dB1UPcSqpwilS1e2sgwB9piLNvBEXLNRXiLYyTiH22zkFZHAEQonJ3J25a47fwo4="}'); 
     var Expires = stuff.Expires; 
     var GoogleAccessId = stuff.GoogleAccessId; 
     var Signature = encodeURIComponent(stuff.Signature); 
     var BUCKET = 'mybucket'; 
     var request = $window.gapi.client.request({ 
      'path': '/upload/storage/v1/b/' + BUCKET + '/o', 
      'method': 'POST', 
      'params': { 
      'uploadType': 'multipart', 
      'Expires': Expires, 
      'GoogleAccessId': GoogleAccessId, 
      'Signature': Signature 
      }, 
      'headers': { 
      'Content-Type': 'multipart/mixed; boundary="' + boundary + '"' 
      }, 
      'body': multipartRequestBody}); 

     request.execute(function(r) { 
      console.log(r); 
     }) 
     } 

Czy można używać podpisanych adresów URL z klientem javascript gapi? Czy też nie rozumie params.

Jeśli nie - czy istnieją przykłady robienia CORS z api JSON z javascript do przesłania z podpisanymi adresami URL?

(pozwala zakładać, że mój wygaśnięcia GoogleAccessId & Podpis są poprawne & mecz co robię w javascript & uprawnieniami Wcześniej skonfigurować na wiadrze)

zasadzie są jakieś przykłady wysłaniem do google przechowywania w chmurze z klienta javascript z lokalnego hosta bez konieczności posiadania konta Google & bez korzystania z publicznie zapisywalnego zasobnika, ale z użyciem dystrybuowanych adresów URL?

+0

Witam Robert, szukałem tego samego. Czy udało ci się to zrobić w końcu? – Alex

+0

Wydaje mi się, że zrezygnowałem i próbowałem czegoś innego, a potem dowiedziałem się, że mój podpisany adres URL był przez cały czas błędny - prawdopodobnie zadziałałby, gdybym poprawnie podpisał mój adres URL. Możesz użyć gcutil, aby stworzyć poprawny adres URL i spróbować. –

+0

Zrobiłem to za pomocą gsutil, ale nie możesz go użyć z/upload/storage/v1, musisz wysłać żądanie PUT, które mi się nie udało z powodu zasad CORP, więc zrezygnowałem i właśnie upubliczniłem wiadro dla teraz. – Alex

Odpowiedz

0

Użyj https://storage.googleapis.com jako hosta, aby utworzyć adres URL wskazujący żądany zasób. Możesz wybrać jedną z kilku metod tworzenia podstawowego adresu URL. Here to niektóre z możliwych kombinacji.

Dla odniesienia można również sprawdzić a very simple snippet Python, które mogą być pomocne.

Mam nadzieję, że to pomaga.

0

Wdrażałem ten sam problem. Problem dotyczy SignedURL. Po skorygowaniu signedurl przesyłanie działało jak urok.

Podczas korzystania z php. Poniżej znajduje się kod do generowania podpisanych adresów URL.

private function createSignedUrl($objectName, $bucketName, $key, $serviceEmailAddress, $method = 'GET', $duration = 600) 
{ 
    $expires = time() + $duration; 

// Line breaks are important! 
$toSign = (
    $method . "\n" . 
    /* Content-MD5 */ "\n" . 
    /* Content Type */ "\n" . 
    $expires . "\n" . 
    $objectName 
); 
$signature = urlencode(base64_encode(JWT::encode($toSign, $key, 'HS256'))); 
return array(
    'expires' => $expires, 
    'accessid' => $serviceEmailAddress, 
    'signature' => $signature, 
); 
} 
+0

Czy to nadal działa? Miałem go w wersji 1.0, ale po aktualizacji do wersji 2.0 i próbie migracji nie działa. Zasadniczo robię dokładnie tak, jak powyżej – Tallkotten

Powiązane problemy