有来自Firebase的示例代码,有关如何在此处创建缩略图:
https://github.com/firebase/functions-samples/blob/master/quickstarts/thumbnails/functions/index.js
代码是这样的
// [START import]
const functions = require('firebase-functions');
const gcs = require('@google-cloud/storage')();
const spawn = require('child-process-promise').spawn;
const path = require('path');
const os = require('os');
const fs = require('fs');
// [END import]
// [START generateThumbnail]
/**
* When an image is uploaded in the Storage bucket We generate a thumbnail automatically using
* ImageMagick.
*/
// [START generateThumbnailTrigger]
exports.generateThumbnail = functions.storage.object().onFinalize((object) => {
// [END generateThumbnailTrigger]
// [START eventAttributes]
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.
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.
// [END eventAttributes]
// [START stopConditions]
// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith('image/')) {
console.log('This is not an image.');
return null;
}
// Get the file name.
const fileName = path.basename(filePath);
// Exit if the image is already a thumbnail.
if (fileName.startsWith('thumb_')) {
console.log('Already a Thumbnail.');
return null;
}
// [END stopConditions]
// [START thumbnailGeneration]
// Download file from bucket.
const bucket = gcs.bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
const metadata = {
contentType: contentType,
};
return bucket.file(filePath).download({
destination: tempFilePath,
}).then(() => {
console.log('Image downloaded locally to', tempFilePath);
// Generate a thumbnail using ImageMagick.
return spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]);
}).then(() => {
console.log('Thumbnail created at', tempFilePath);
// We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail.
const thumbFileName = `thumb_${fileName}`;
const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
// Uploading the thumbnail.
return bucket.upload(tempFilePath, {
destination: thumbFilePath,
metadata: metadata,
});
// Once the thumbnail has been uploaded delete the local file to free up disk space.
}).then(() => fs.unlinkSync(tempFilePath));
// [END thumbnailGeneration]
});
// [END generateThumbnail]
但是尝试了上面的代码之后,看起来创建的缩略图与原始图像(个人资料图像)位于同一文件夹中,如下图所示
如果我希望缩略图位于名为“ thumbnail”的另一个文件夹中,该怎么办?因此,如果将图像上传到“ profileImage”文件夹,则缩略图将被放置到“缩略图”文件夹
答案 0 :(得分:2)
您需要修改的代码在这里:
const thumbFileName = `thumb_${fileName}`;
const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
// Uploading the thumbnail.
return bucket.upload(tempFilePath, {
destination: thumbFilePath,
metadata: metadata,
});
它正在构建到Cloud Storage中应在thumbFilePath
中上传文件的位置的路径。您会看到它正在加入filePath
目录和文件名thumbFileName
。 filePath
被定义为原始文件在开头的位置:
const filePath = object.name; // File path in the bucket.
所有这些意味着,无论原始文件上传到哪里,缩略图都会被组织在其旁边。
如果要更改最终缩略图的位置,请使thumbFilePath
包含该位置。可能像这样更改它一样简单:
const thumbFilePath = `thumbnail/${thumbFileName}`
或者您需要的任何东西。