Извлекать и загружать все файлы из набора путей в облачном хранилище Google с помощью NodeJS

#javascript #node.js #google-cloud-platform #google-cloud-functions #google-cloud-storage

# #javascript #node.js #google-облачная платформа #google-cloud-функции #google-облачное хранилище

Вопрос:

У меня есть массив entryIdsWithImages , который похож на имена папок в облачном хранилище Google, откуда я должен загрузить все изображения, т. Е. Я хочу загрузить все изображения с этих конкретных путей GCP. Итак, согласно @google-cloud/storage документам, я сначала извлекаю все файлы из этих путей, затем загружаю их во временный каталог, который позже заархивирую. Однако я обнаружил, что загруженные изображения имели размер 0B, тогда как их нет в реальном хранилище. Где я ошибаюсь?

 await Promise.all(
    entryIdsWithImages.map(async (entryId) => {
        const prefix = `images/${uid}/${entryId}`;
        // download the images for the entry.
        const [files] = await bucket.getFiles({
        prefix,
        });
        files.forEach(async (file) => {
        // file.name includes the whole path to the file, thus extract only the innermost path, which will be the name of the file
        const fileName = file.name.slice(
            file.name.lastIndexOf('/')   1
        );
        const imgTempFilePath = path.join(imageDirectory, fileName);
        try {
            await file.download({
            destination: `${imgTempFilePath}.jpg`,
            });
        } catch (e) {
            console.log(
            `Error downloading the image at ${prefix}/${fileName}: `,
            e
            );
        }
        });
    })
)
 

Версия, которую я использую: "@google-cloud/storage": "^4.7.0" . Я пробовал использовать последнюю версию, но получил те же результаты.

Комментарии:

1. Что произойдет, если вы загрузите один файл с известным именем файла? await storage.bucket(bucketName).file(srcFilename).download(destination: "foo.jpg"}); ?

2. Это работает нормально. Изображение загружается, как и ожидалось

3. Я пробовал ваш точный код, и он работал со мной (с расширениями и без расширений). Я также пробовал с 4.7.0 и последней версией, так же, как это сработало. Я предлагаю вам попробовать: 1- та же функция, но только с одним префиксом 2- другое ведро

Ответ №1:

Код API облачного хранилища выглядит правильным для меня. Я ожидаю, что это ваша проблема:

 destination: `${imgTempFilePath}.jpg`,
 

Изменение типа файла на jpg может привести к повреждению файлов, которые выглядят как 0K.

Этот код отлично подходит для поиска в моем корзине:

 const downloadAll = async (bucket) => {
    const imageDirectory = 'downloads';
    const prefix = `READ`;
    // download the images for the entry.
    const [files] = await bucket.getFiles({
        prefix,
    });
    files.forEach(async (file) => {
        console.log(`file: ${file}`);
        // file.name includes the whole path to the file, thus extract only the innermost path, which will be the name of the file
        const fileName = file.name.slice(
            file.name.lastIndexOf('/')   1
        );
        const imgTempFilePath = path.join(imageDirectory, fileName);
        try {
            await file.download({
                destination: `${imgTempFilePath}.jpg`,
            });
        } catch (e) {
            console.log(
                `Error downloading the image at ${prefix}/${fileName}: `,
                e
            );
        }
    });
}
 

Комментарии:

1. Я не думаю, что это проблема. 1. Я пробовал с явным расширением и без него, результат был тот же. 2. Не было никаких проблем, когда я явно указывал полные пути к файлам (включая имя файла), но когда я пробую этот способ, т. Е. Получаю имена файлов, а затем загружаю, размер равен 0.

2. Вы пробовали это на других файлах? Ваш код отлично работает для моей корзины.