Файл изображения может быть загружен в хранилище 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".
В редакторе сценариев выберите «Файл» и «Свойства проекта» и перейдите на вкладку «Области». Скопируйте все существующие области и вставьте их куда-нибудь, чтобы их можно было вернуть.
В редакторе сценариев выберите «Просмотр» и «Показать файл манифеста». Нажмите на файл 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;
Получить токен 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
}
}