Загрузить изображение из функции Google Cloud в облачное хранилище

Я пытаюсь обрабатывать загрузку файлов с помощью облачной функции Google. Эта функция использует Busboy для анализа данных составной формы и последующей загрузки в Google Cloud Storage.

Я получаю ту же ошибку: ERROR: { Error: ENOENT: no such file or directory, open '/tmp/xxx.png' ошибка при запуске функции.

Ошибка возникает в finish функции обратного вызова, когда storage.bucket.upload (файл) пытается открыть путь к файлу /tmp/xxx.png.

Обратите внимание, что я не могу создать подписанный URL-адрес загрузки, как это предлагается в этот вопрос, поскольку вызывающее его приложение является внешним, а не пользовательским приложением. Я также не могу загружать файлы напрямую в GCS, так как мне нужно будет создавать собственные имена файлов на основе некоторых метаданных запроса. Должен ли я вместо этого просто использовать Google App Engine?

Код функции:

const path = require('path');
const os = require('os');
const fs = require('fs');
const Busboy = require('busboy');
const Storage = require('@google-cloud/storage');
const _ = require('lodash');

const projectId = 'xxx';
const bucketName = 'xxx';


const storage = new Storage({
  projectId: projectId,
});

exports.uploadFile = (req, res) => {
    if (req.method === 'POST') {
        const busboy = new Busboy({ headers: req.headers });
        const uploads = []
        const tmpdir = os.tmpdir();

        busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
            const filepath = path.join(tmpdir, filename)
            var obj = {
                path: filepath, 
                name: filename
            }
            uploads.push(obj);

            var writeStream = fs.createWriteStream(obj.path);
            file.pipe(writeStream);
        });

        busboy.on('finish', () => {
            _.forEach(uploads, function(file) {

                storage
                .bucket(bucketName)
                .upload(file.path, {name: file.name})
                .then(() => {
                  console.log(`${file.name} uploaded to ${bucketName}.`);
                })
                .catch(err => {
                  console.error('ERROR:', err);
                });


                fs.unlinkSync(file.path);
            })

            res.end()
        });

        busboy.end(req.rawBody);
    } else {
        res.status(405).end();
    }
}

person swigganicks    schedule 12.07.2018    source источник


Ответы (1)


В конце концов я отказался от использования Busboy. Последние версии Google Cloud Functions поддерживают как Python, так и Node 8. В узле 8 я просто помещаю все в функции async / await, и все работает нормально.

person swigganicks    schedule 25.07.2018
comment
Привет @swigganicks Я тоже столкнулся с той же проблемой, если вы ее исправили, не могли бы вы объяснить подробно или опубликовать пример кода. Заранее спасибо. - person Saikumar Anireddy; 23.12.2018
comment
@swigganicks, был бы признателен за образец как на то же - person user1552175; 27.12.2018
comment
Извините, у меня больше нет кода для этого. Вместо этого я использовал Python. - person swigganicks; 27.12.2018