Файл, который я преобразовал с помощью FFMPEG в функции Firebase Cloud, недоступен - PullRequest
0 голосов
/ 06 мая 2020

Ниже приведен код моей облачной функции.

    exports.increaseVolume = functions.storage.object().onFinalize(async (object) => {
    const fileBucket = object.bucket; // The Storage bucket that contains the file.
    const filePath = object.name; // File path in the bucket.
    const contentType = object.contentType; // File content type.

    // Exit if this is triggered on a file that is not an audio.
    if (!contentType.startsWith('video/mp4')) {
      console.log('This is not an audio.');
      return null;
    }

    // Get the file name.
    const fileName = path.basename(filePath);
    // Exit if the audio is already converted.
    if (fileName.endsWith('_output.mp4')) {
      console.log('Already a converted audio.');
      return null;
    }

    // Download file from bucket.
    const bucket = gcs.bucket(fileBucket);
    const tempFilePath = path.join(os.tmpdir(), fileName);
    // We add a '_output.flac' suffix to target audio file name. That's where we'll upload the converted audio.
    const targetTempFileName = fileName.replace(/\.[^/.]+$/, '') + '_output.mp4';
    const targetTempFilePath = path.join(os.tmpdir(), targetTempFileName);
    const targetStorageFilePath = path.join(path.dirname(filePath), targetTempFileName);

    await bucket.file(filePath).download({destination: tempFilePath});
    console.log('Audio downloaded locally to', tempFilePath);
    // Convert the audio to mono channel using FFMPEG.

    let command = ffmpeg(tempFilePath)
        .audioFilters([
        {
          filter: 'volume',
          options: '5dB'
        },
        {
          filter: 'afftdn'
        }
      ])
        .format('mp4')
        .output(targetTempFilePath);

    await promisifyCommand(command);
    console.log('Output audio created at', targetTempFilePath);
    // Uploading the audio.
    await bucket.upload(targetTempFilePath, {destination: targetStorageFilePath});

    console.log('Output audio uploaded to', targetStorageFilePath);

    // Once the audio has been uploaded delete the local file to free up disk space.
    fs.unlinkSync(tempFilePath);
    fs.unlinkSync(targetTempFilePath);

    return console.log('Temporary files removed.', targetTempFilePath);
  });

Вот как отображается файл в моем хранилище. Где взять ссылку для скачивания или как получить доступ к файлу ?. Когда я набирал ссылку в браузере, она возвращает JSON, говоря 403 - несанкционированный доступ.

enter image description here

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Сообщение, с которым вы столкнулись, касается разрешений. У кого к чему должен быть доступ?

Прежде всего, вы должны подумать о логах вашего бизнеса c. У кого должен быть доступ к этому файлу? Хорошо, если этот файл будет опубликован c? Есть ли временные рамки, в которые файл должен быть доступен? Данные должны оставаться в Bucket или их можно удалить?

Думаю, у вас есть два варианта:

  1. Создать Bucket с publi c data , в таком случае данные будут доступны для всех, у кого есть доступ к указанному c имени файла в Bucket.

  2. Если указанное выше не разрешено, вы можете создать SignedURL , как указано @Renaud Tarne c пример ссылки . Вы должны иметь в виду, что SignedURL имеет ограниченный по времени доступ, и каждый, у кого есть URL-адрес, сможет получить объект. По истечении времени доступ к объекту больше не будет.

После того, как вы определили это, вы можете удалить объект в своем сегменте программно или вы можно установить Управление жизненным циклом . Здесь вы можете установить конфигурации, которые содержат набор правил, например, удалять созданные объекты по их возрасту (в днях).

0 голосов
/ 06 мая 2020

Вам необходимо использовать метод getSignedUrl() следующим образом:

const uploadResp = await bucket.upload(targetTempFilePath, {destination: targetStorageFilePath});

const file = uploadResp[0];

const options = {
       action: 'read',
       expires: '03-17-2025'
};

const getSignedUrlResponse = await file.getSignedUrl(options);
const url = getSignedUrlResponse[0];

//Do wathever you want with this url: save it in Firestore for example
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...