我正在跟踪tutorial,以便在上传时通过Cloud Functions调整图像大小,并且遇到了两个我无法弄清的主要问题:
1)如果上传了PNG,它将生成正确大小的缩略图,但不会在Firestorage中加载它们的预览(“加载”微调框将无限期显示)。它仅在我单击“生成新的访问令牌”后显示图像(最初生成的缩略图都没有访问令牌)。
2)如果上载JPEG或任何其他格式,则MIME类型显示为“ application / octet-stream”。我不确定如何正确提取扩展名以放入新生成的缩略图的文件名中?
export const generateThumbs = functions.storage
.object()
.onFinalize(async object => {
const bucket = gcs.bucket(object.bucket);
const filePath = object.name;
const fileName = filePath.split('/').pop();
const bucketDir = dirname(filePath);
const workingDir = join(tmpdir(), 'thumbs');
const tmpFilePath = join(workingDir, 'source.png');
if (fileName.includes('thumb@') || !object.contentType.includes('image')) {
console.log('exiting function');
return false;
}
// 1. Ensure thumbnail dir exists
await fs.ensureDir(workingDir);
// 2. Download Source File
await bucket.file(filePath).download({
destination: tmpFilePath
});
// 3. Resize the images and define an array of upload promises
const sizes = [64, 128, 256];
const uploadPromises = sizes.map(async size => {
const thumbName = `thumb@${size}_${fileName}`;
const thumbPath = join(workingDir, thumbName);
// Resize source image
await sharp(tmpFilePath)
.resize(size, size)
.toFile(thumbPath);
// Upload to GCS
return bucket.upload(thumbPath, {
destination: join(bucketDir, thumbName)
});
});
// 4. Run the upload operations
await Promise.all(uploadPromises);
// 5. Cleanup remove the tmp/thumbs from the filesystem
return fs.remove(workingDir);
});
非常感谢您的反馈!
答案 0 :(得分:7)
我只是遇到了同样的问题,由于未知原因,Firebase的“调整大小图像”故意从调整大小后的图像中删除了下载令牌
禁止删除下载访问令牌
注意:原始尺寸和调整后的尺寸将具有相同的令牌。
答案 1 :(得分:1)
我刚刚开始使用扩展程序。我注意到,在单击“创建访问令牌”之前,无法从Firebase控制台访问图像预览。 我想您必须在可用图像之前以编程方式创建此令牌。
我希望对您有帮助
答案 2 :(得分:0)
2020年11月
关于@Somebody答案,我似乎在GCP Cloud Functions
中找不到 ext-storage-resize-images-generateResizedImage更好的方法是重用原始文件的firebaseStorageDownloadTokens
这就是我的方式
functions
.storage
.object()
.onFinalize((object) => {
// some image optimization code here
// get the original file access token
const downloadtoken = object.metadata?.firebaseStorageDownloadTokens;
return bucket.upload(tempLocalFile, {
destination: file,
metadata: {
metadata: {
optimized: true, // other custom flags
firebaseStorageDownloadTokens: downloadtoken, // access token
}
});
});