Firebase функция получить URL-адрес загрузки после успешного сохранения изображения в облачное хранилище FireBase
У меня проблемы с получением URL-адреса для загрузки в функции Firebase после сохранения изображения в облачном хранилище. Ниже моя функция firebase http в машинописном тексте для сохранения строки base64 в формате jpeg в облачном хранилище firebase. когда я регистрирую результат, он всегда пуст. Я перехожу по этой ссылке, чтобы получить ссылку для скачивания " Получить общедоступный URL из файла, загруженного с помощью firebase-admin ". Но это выдает мне следующую ошибку: " SigningError: API Identity and Access Management (IAM) ранее не использовался в проекте 81673989436 или он отключен". И не смог найти простой пример для подражания. Мой план состоит в том, чтобы обновить мою таблицу Firestore, после загрузки в облачное хранилище.
export const publishImage = functions.https.onRequest((req, res) => {
// Convert the base64 string back to an image to upload into the Google
// Cloud Storage bucket
const base64EncodedImageString=req.body.image.replace(/^data:image\/jpeg;base64,/, "");
const mimeType = 'image/jpeg';
const randomFileName = crypto.randomBytes(16).toString('hex') + '.jpeg';
const imageBuffer = new Buffer(base64EncodedImageString, 'base64');
const bucket = admin.storage().bucket();
// Upload the image to the bucket
const file = bucket.file('images/' + randomFileName);
file.save(imageBuffer, {
metadata: { contentType: mimeType },
}).then(result => {
console.log(result);
file.makePublic();
file.getSignedUrl({
action: 'read',
expires: '03-09-2491'
}).then(urls => {
console.log(urls[0]);
})
});
return res.status(200).send("NOT WORKING");
})
Ошибка как следует в консоли Firebase. Даже с ошибкой я могу сохранить изображение в памяти.
SigningError: Разрешение iam.serviceAccounts.signBlob требуется для выполнения этой операции над учетной записью службы projects/vmsystem-4aa54/serviceAccounts/vmsystem-4aa54@appspot.gserviceaccount.com. по адресу /user_code/node_modules/@google-cloud/storage/src/file.js:1715:16 at Request._callback (/user_code/node_modules/@google-cloud/storage/node_modules/google-auto-auth/index.js:356:9) в Request.self.callback (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:186:22) в emitTwo (events.js:106:13) по запросу. испустить (events.js:191:7) по запросу. (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1163:10) в emitOne (events.js:96:13) в Request.emit (events.js:188:7) в IncomingMessage. (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1085:12) в IncomingMessage.g (events.js:292:16)
Как я могу получить URL для загрузки?
Я запутался. Теперь я застрял в обновлении функции после изменений. Ниже моя инициализация для администратора.
import * as admin from 'firebase-admin';
const serviceAccount = require('./../service_account.json');
try {
// admin.initializeApp(functions.config().firebase); // initial
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://vmsystem-4aa54.firebaseio.com"
});
} catch(e) {}
import * as simpletest from './simpletest';
export const testsomething = simpletest.helloWorld;
2 ответа
Вы не показываете весь код здесь (например, как вы инициализировали Firebase Admin SDK для создания admin
). Поэтому я предполагаю, что вы использовали учетные данные проекта по умолчанию для его инициализации следующим образом:
import * as admin from 'firebase-admin'
admin.initializeApp()
Этого недостаточно, чтобы иметь возможность использовать getSignedUrl при обращении к административному SDK для использования API-интерфейсов облачного хранилища. Если вы хотите использовать getSignedUrl, вам нужно будет предоставить учетные данные для выделенной учетной записи службы, которую вы создаете в консоли.
Предполагая, что вы помещаете эти учетные данные в файл yourServiceAccount.json в своей папке функций, вы должны инициализировать административный SDK с такими учетными данными, как показано ниже:
import * as serviceAccount from 'yourServiceAccount.json';
const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG)
adminConfig.credential = admin.credential.cert(<any>serviceAccount)
admin.initializeApp(adminConfig);
Обратите внимание, что для этого нужно просто взять конфигурацию проекта по умолчанию из FIREBASE_CONFIG и добавить к ним учетную запись службы.
Чтобы получить импорт файла JSON, вам также понадобится файл (называемый typings.d.ts):
declare module "*.json" {
const value: any;
export default value;
}
Спасибо @Doug Стивенсон. Я верю, что нашел ответ.
Я решаю ошибки развертывания путем воссоздания нового проекта.
Я изменяю свою инициализацию на код ниже, чтобы решить необработанный отказ. Перейдите в раздел "Учетные записи служб" в разделе "Настройки проекта" в своем проекте Firebase и создайте новый закрытый ключ в Firebase Admin SDK.
const serviceAccount = require('./path/to/serviceaccount.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: '<ur database url>', // check it under service accounts storageBucket: '<ur storage bucket url>' //check it in script snippet require to add to your website. });