Как увеличить максимальный размер HTTP-запроса для HTTP-триггеров в Cloud Functions

Я пытаюсь вызвать облачную функцию Google, отправляя изображения размером более 50 МБ. Цель облачной функции - изменить размер изображений и загрузить их в облачное хранилище Google.

Однако, когда я отправляю сообщение HTTP в свою облачную функцию, я получаю следующую ошибку: 413 Request Entity Too Large

Есть ли у кого-нибудь способ обхода этой ошибки? Могу ли я увеличить лимит размера HTTP-запроса?


person João Rulff    schedule 03.05.2018    source источник


Ответы (2)


Предел для загрузки и загрузки данных триггера HTTP зафиксирован в 10 МБ. Невозможно увеличить этот лимит, но вы всегда можете отправить запрос функции объясняя, почему его нужно увеличивать.

person Doug Stevenson    schedule 03.05.2018
comment
Привет, Дуг, а как насчет сжатия данных? есть ли какие-либо тематические исследования по этому поводу или примеры сжатия данных для HTTP-ответов от CF или HTTP-запросов от клиентов? Я подумывал о том, чтобы пойти по пути сжатия, но решил просто поместить данные в GCS, а затем получить доступ через Firebase от клиента (очень хорошо подходит для моего варианта использования). - person insta catering; 14.10.2020

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

Затем запустите триггер облачной функции, чтобы изменить размер изображения. И удалите исходное изображение, когда закончите.

Прилагаю свой пример кода - вы должны добавить удаление файла после преобразования ...

/**
 * When an image is uploaded in the Storage bucket We generate a thumbnail automatically using
 * ImageMagick.
 * After the thumbnail has been generated and uploaded to Cloud Storage,
 * we write the public URL to the Firebase Realtime Database.
 */
exports.generateThumbnail = functions.storage.object().onFinalize((object) => {
  console.log('Generated Started');

  // File and directory paths.
  const filePath = object.name;
  const contentType = object.contentType; // This is the image MIME type
  const fileDir = path.dirname(filePath);
  const fileName = path.basename(filePath);
  const thumbFilePath = path.normalize(path.join(fileDir, `${THUMB_PREFIX}${fileName}`));
  const tempLocalFile = path.join(os.tmpdir(), filePath);
  const tempLocalDir = path.dirname(tempLocalFile);
  const tempLocalThumbFile = path.join(os.tmpdir(), thumbFilePath);

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

  // Exit if the image is already a thumbnail.
  if (fileName.startsWith(THUMB_PREFIX)) {
    console.log('Already a Thumbnail.');
    deleteImage(filename);
    return null;
  }

  // Cloud Storage files.
  const bucket = gcs.bucket(object.bucket);
  const file = bucket.file(filePath);
  const thumbFile = bucket.file(thumbFilePath);
  const metadata = {
    contentType: contentType,
    // To enable Client-side caching you can set the Cache-Control headers here. Uncomment below.
    'Cache-Control': 'public,max-age=3600',
  };
  // Create the temp directory where the storage file will be downloaded.
  return mkdirp(tempLocalDir).then(() => {
    console.log('DL Started');

    // Download file from bucket.
    return file.download({
      destination: tempLocalFile
    });
  }).then(() => {
    console.log('The file has been downloaded to', tempLocalFile);
    // Generate a thumbnail using ImageMagick.
    return spawn('convert', [tempLocalFile, '-thumbnail', `${THUMB_MAX_WIDTH}x${THUMB_MAX_HEIGHT}>`, tempLocalThumbFile], {
      capture: ['stdout', 'stderr']
    });
  }).then(() => {
    console.log('Thumbnail created at', tempLocalThumbFile);
    // Uploading the Thumbnail.
    return bucket.upload(tempLocalThumbFile, {
      destination: thumbFilePath,
      metadata: metadata
    });
  }).then(() => {
    console.log('Thumbnail uploaded to Storage at', thumbFilePath);
    // Once the image has been uploaded delete the local files to free up disk space.
    fs.unlinkSync(tempLocalFile);
    fs.unlinkSync(tempLocalThumbFile);
    // Get the Signed URLs for the thumbnail and original image.
    const config = {
      action: 'read',
      expires: '03-01-2500',
    };
    return Promise.all([
      thumbFile.getSignedUrl(config),
      // file.getSignedUrl(config),
    ]);
  }).then((results) => {
    console.log('Got Signed URLs.');
    const thumbResult = results[0];
    // const originalResult = results[1];
    const thumbFileUrl = thumbResult[0];
    // const fileUrl = originalResult[0];
    // Add the URLs to the Database
    const uid = getUidFromFilePath(fileDir);
    if (!uid) return null;

    return Promise.all([
      admin.auth().updateUser(uid, {
        photoURL: thumbFileUrl
      }),
      admin.database().ref(`/users/${uid}/profile/photoURL`).set(thumbFileUrl)
    ]);
  }).then(() => console.log('Thumbnail URLs saved to database.'));
});

person jBOB    schedule 31.05.2018