Как загрузить файлы в хранилище Firebase с Google Drive с помощью скрипта Apps? - PullRequest
0 голосов
/ 03 июня 2018

Мне нужно, чтобы некоторые пользователи могли загружать файлы в хранилище Firebase, но они не разбираются в технологиях, поэтому я позволю им загружать файлы сначала на диск, а зеркалировать диск из хранилища.Дело в том, что я не могу понять, как без размещения сервера;Сценарии приложений Google не могут легко получить доступ к хранилищу FireBase (хотя он может обращаться и к обеим базам данных FireBase), и мне нужен сервер, чтобы использовать API накопителя Google, что можно было бы сделать с помощью облачных функций FireBase, но мне интересно, есть ли более простая альтернатива.

1 Ответ

0 голосов
/ 24 октября 2018

Файл изображения может быть загружен в хранилище Firebase с помощью скрипта Apps.

Необходимо выполнить четыре важных действия:

  • Включить «JSON API Google Cloud Storage»"
  • Получите имя" bucket "вашего хранилища Firebase
  • Добавьте область" https://www.googleapis.com/auth/devstorage.read_write" "в файл манифеста appsscript.json вместе со всеми другими уже необходимыми областями.
  • Включить доступ «Запись» в ваших правилах хранения Firebase

Вам потребуется получить токен OAuth, но вам не нужна библиотека OAuth.

Включить"JSON API Google Cloud Storage"

Это необходимо сделать для учетной записи Google, которая будет загружать файл. Описанное здесь решение предназначено для загрузки файла, в котором находятся проект скрипта Apps и хранилище Firebase.принадлежит одной и той же учетной записи Google.

  • Перейдите на свою облачную платформу Google. В редакторе кода выберите «Ресурсы» и «Проект облачной платформы». Щелкните что-нибудь в диалоговом окне, чтобы перейти к.Облачная платформа.Найдите раздел «API и сервисы».Нажмите «Включить API и службы» Поиск «JSON» Включите службу «Google Cloud Storage JSON API».

Получите «bucket» имя вашего хранилища Firebase

Перейдите к своемуНастройки Firebase Storage.Поищите «gs: //your-bucket-name.appsspot.com» Это имя вашего сегмента.Не включайте "gs: //". В конце имени сегмента должна быть часть "appspot.com".

Добавьте область "https://www.googleapis.com/auth/devstorage.read_write" к манифесту appsscript.json.file

В редакторе сценариев выберите «Файл» и «Свойства проекта» и перейдите на вкладку «Области». Скопируйте все существующие области и вставьте их куда-нибудь, чтобы их можно было вернуть.

В редакторе сценариев выберите «Просмотр» и «Показать файл манифеста». Нажмите на файл appsscript.json, чтобы открыть его. Добавьте все существующие области, плюс область «https://www.googleapis.com/auth/devstorage.read_write"» в файл манифеста..

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

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "webapp": {
    "access": "ANYONE_ANONYMOUS",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER",
  "oauthScopes": [
    "https://mail.google.com/",
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/script.container.ui",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/script.scriptapp",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/userinfo.email",
    "https://www.googleapis.com/auth/devstorage.read_write"
  ]
}

Включите доступ «Запись» в ваших правилах хранения Firebase

allow read, write: if request.auth != null;

Firebase Storage Rules

Получить токен OAuth:

Вы можете получить токен OAuth с помощью:

ScriptApp.getOAuthToken();

Так что вам не нужнобиблиотека OAuth, вам не нужен SDK, вам не нужно ничего делать с кодом на стороне клиента, вам не нужна специальная информацияиз учетной записи службы Firebase или унаследованной базы данных Secret.

Код:

Этот код загружает файл изображения с Google Диска в хранилище Firebase

Примечание!Любой файл размером более 5 МБ может нуждаться в чем-то немного отличающемся.

function uploadToFirebaseStorage(po) {
try{
  var blob,bucketName,bytes,fileID,fileName,folderName,
    oA_Tkn,options,pathAndName,response,result,url;

  /* See
    https://cloud.google.com/storage/docs/uploading-objects?authuser=0
    for REST API information
  */

  /*
    Firebase uses the Google Cloud Storage API

  */

  bucketName = "your-bucket-name.appspot.com";
  folderName = "folder_name";
  fileName = "file_name";

  pathAndName = folderName + "/" + fileName;

  fileID = po.fileId;

  //curl "https://www.googleapis.com/upload/storage/v1/b/[BUCKET_NAME]/o?uploadType=media&name=[OBJECT_NAME]"
  url = 'https://www.googleapis.com/upload/storage/v1/b/' + bucketName + '/o?uploadType=media&name=' + pathAndName;

  blob = DriveApp.getFileById(fileID).getBlob();
  //Logger.log('blob.getContentType(): ' + blob.getContentType())

  bytes = blob.getBytes();
  //Logger.log('bytes: ' + bytes)

  oA_Tkn = ScriptApp.getOAuthToken();
  options = {
    method: "POST",//curl -X POST
    muteHttpExceptions: true,
    contentLength: bytes.length,
    contentType: blob.getContentType(),//curlv-H "Content-Type: [OBJECT_CONTENT_TYPE]"
    payload: bytes,
    headers: {//curl -H "Authorization: Bearer [OAUTH2_TOKEN]"
    Authorization: 'Bearer ' + oA_Tkn
    }
  }

  response = UrlFetchApp.fetch(url, options);

  result = JSON.parse(response.getContentText());
  Logger.log(JSON.stringify(result, null, 2));


  /*
    A successful return object looks like:

{
"kind": "storage#object",
"id": "bucket-name.appspot.com/online_store/file_name/abc123",
"selfLink": "https://www.googleapis.com/storage/v1/b/bucket-name.appspot.com/o/online_store%2FAAA_Test",
"name": "folder_Name/file_name",
"bucket": "bucket-name.appspot.com",
"generation": "abc123",
"metageneration": "1",
"contentType": "image/jpeg",
"timeCreated": "2018-10-24T00:47:33.435Z",
"updated": "2018-10-24T00:47:33.435Z",
"storageClass": "STANDARD",
"timeStorageClassUpdated": "2018-10-24T00:47:33.435Z",
"size": "950012",
"md5Hash": "abc123==",
"mediaLink": "https://www.googleapis.com/download/storage/v1/b/bucket-name.appspot.com/o/some_name%2FAAA_Test?generation=abc123&alt=media",
"crc32c": "kIY6Qg==",
"etag": "nwrfwfn="
}
*/
}catch(e) {
  Logger.log(e.message + "\n\n" + e.stack)

}
}

function testFB_Upload() {
  uploadToFirebaseStorage({fileId:"Put image file ID here"});
}

Когда код запускается в первый раз, если пользователь не включил API, в расширенной ссылке есть ссылкасообщение об ошибке в ответе.Таким образом, вы можете изменить код, чтобы получить ссылку Cloud Console из сообщения об ошибке.Эта ссылка ведет непосредственно к правильному API Cloud Console, поэтому пользователю не нужно знать, как перемещаться по своей Cloud Console, чтобы найти правильный API.

Как получить URL для загрузки после того, как изображениебыло загружено

<head>
    <title>Your Site Name</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Firebase App is always required and must be first -->
    <script src="https://www.gstatic.com/firebasejs/5.5.7/firebase-app.js"></script>
    <script src="https://www.gstatic.com/firebasejs/5.5.7/firebase-auth.js"></script>
    <script src="https://www.gstatic.com/firebasejs/5.5.7/firebase-storage.js"></script>

  <script>
    // Initialize Firebase
    //Open the project - click Project Overview - Click the </> icon
    var config = {
      apiKey: "abc123",//Web API key in project settings
      authDomain: "your_name.firebaseapp.com",
      //databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
      projectId: "myID",//In Project Settings
      storageBucket: "myDomain.appspot.com"
    };
    firebase.initializeApp(config);
  </script>

</head>



window.srchForFile = function(po) {//client side code in a script tag
  //This function is called from a success handler AFTER the file has
  //originally been uploaded
try{
  /*
    po - parameters object - {fileID:'123ABC',folderName:'name_here'}
    po.fileID - the ID of the original file that was uploaded
    po.folderName - the name of the firebase folder to search
  */

  /*
    This code assumes that the firebase SDK has been loaded and that the
    firebase class is available
  */

  var fileID,fileName,imagesRef,spaceRef;

  fileID = po.fileId;
  fileName = "IMG_" + fileID;//The file name to search for which must
    //be exactly the same as the file just uploaded - make sure to use
    //a naming convention that is consistent

  if (!STORAGE_REF) {
    STORAGE_REF = firebase.storage().ref();//firebase SDK must be loaded
  }

  imagesRef = STORAGE_REF.child(po.folderName);
  //console.log('imagesRef: ' + imagesRef);

  spaceRef = imagesRef.child(fileName);// Points to the file name
  //console.log('spaceRef: ' + spaceRef);

  spaceRef.getDownloadURL().then(function(url) {
    //console.log('File available at: ' + url);

    if (!url) {
      url = false;
    }

    nextStepAfterFileSrch(url);//Now run another function
  }).catch(function(error) {//There was an error
     // Handle any errors here
     nextStepAfterFileSrch(false);
   }

  );

  //DO NOT HAVE ANY CODE HERE OR IT WILL RUN BEFORE THE ABOVE CODE IS
  //DONE
} catch(e) {
  showErrMsg(e.message);//client side error handling
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...