如何使用 Firebase Cloud Functions Storage 创建文件夹
How can make folder with Firebase Cloud Functions Storage
如何创建文件夹 "posts"?
bucket --> gs://app.appspot.com/posts
代码
exports.generateThumbnail = functions.storage.object()
.onChange(event => {
const object = event.data
const filePath = object.name
const fileName = filePath.split('/').pop()
const fileBucket = object.bucket;
const bucket = gcs.bucket(fileBucket)
const tempFilePath = `/posts/${fileName}`
return bucket.file(filePath).download({
destination: tempFilePath
})
.then(() => {
console.log('image downloaded locally to', tempFilePath)
return spawn('convert', [tempFilePath, '-thumbnail', '400x400>', tempFilePath])
})
.then(() => {
console.log('thumbnail created')
// match end of string that contains a slash followed by 0 or more characters that are not a slash:
const thumbFilePath = filePath.replace(/(\/)?([^\/]*)*/, 'thumb_')
console.log('afoter=thumbFilePath=='+thumbFilePath);
return bucket.upload(tempFilePath, {
destination: thumbFilePath
})
})
});
错误
Error: EROFS: read-only file system, open '/posts/image.jpg'?
Cloud Functions 有一个只读文件系统,/tmp
目录除外。您需要使 /posts
目录类似于 /tmp/posts
才能创建目录或写入。您还可以使用 node-tmp 之类的东西来更轻松地管理临时 files/dirs 的创建。
工作代码如下:
//add 3 package
const path = require('path');
const os = require('os');
const fs = require('fs');
exports.generateThumbnail = functions.storage.object()
.onChange(event => {
const object = event.data;
const fileBucket = object.bucket;
const filePath = object.name;
const contentType = object.contentType;
const resourceState = object.resourceState;
const metageneration = object.metageneration;
const bucket = gcs.bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
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', '400x400>', 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});
// Once the thumbnail has been uploaded delete the local file to free up disk space.
}).then(() => fs.unlinkSync(tempFilePath));
});
Successful -> /tmp/posts -> gs://app.appspot.com/posts
如何创建文件夹 "posts"?
bucket --> gs://app.appspot.com/posts
代码
exports.generateThumbnail = functions.storage.object()
.onChange(event => {
const object = event.data
const filePath = object.name
const fileName = filePath.split('/').pop()
const fileBucket = object.bucket;
const bucket = gcs.bucket(fileBucket)
const tempFilePath = `/posts/${fileName}`
return bucket.file(filePath).download({
destination: tempFilePath
})
.then(() => {
console.log('image downloaded locally to', tempFilePath)
return spawn('convert', [tempFilePath, '-thumbnail', '400x400>', tempFilePath])
})
.then(() => {
console.log('thumbnail created')
// match end of string that contains a slash followed by 0 or more characters that are not a slash:
const thumbFilePath = filePath.replace(/(\/)?([^\/]*)*/, 'thumb_')
console.log('afoter=thumbFilePath=='+thumbFilePath);
return bucket.upload(tempFilePath, {
destination: thumbFilePath
})
})
});
错误
Error: EROFS: read-only file system, open '/posts/image.jpg'?
Cloud Functions 有一个只读文件系统,/tmp
目录除外。您需要使 /posts
目录类似于 /tmp/posts
才能创建目录或写入。您还可以使用 node-tmp 之类的东西来更轻松地管理临时 files/dirs 的创建。
工作代码如下:
//add 3 package
const path = require('path');
const os = require('os');
const fs = require('fs');
exports.generateThumbnail = functions.storage.object()
.onChange(event => {
const object = event.data;
const fileBucket = object.bucket;
const filePath = object.name;
const contentType = object.contentType;
const resourceState = object.resourceState;
const metageneration = object.metageneration;
const bucket = gcs.bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
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', '400x400>', 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});
// Once the thumbnail has been uploaded delete the local file to free up disk space.
}).then(() => fs.unlinkSync(tempFilePath));
});
Successful -> /tmp/posts -> gs://app.appspot.com/posts