数据库触发 firebase 函数从 URL 下载图像并将其保存到存储
database triggers firebase function to download images from URL and save it to storage
我想在我的数据库使用 'photo_url' 字段更新时下载图像并将其保存到存储中
exports.saveToStorage = functions.database.ref(`/images/${itemImageRef}`)
.onWrite(event => {
const filePath = event.data.val();
const filename = filePath.split('/').pop();
var download = request.get(filePath).on('error', (err) => {
console.log(err)
})
.pipe(fs.createWriteStream(filename));
download.on('finish', () => {
const bucket = gcs.bucket('id.appspot.com');
const storagePath = `images/${filename}`;
return bucket.upload(download, { destination: storagePath })
.then(() => {
console.log('success upload');
});
});
});
它记录 "Error: EROFS: read-only file system, open 'image.jpg' at Error (native)." 我想我无法检索 createWriteStream 保存的文件?
那么我应该如何从网络上下载图片呢?
使用@Jobsamuel 建议的 post,代码现在可以工作了:
exports.saveToStorage = functions.database.ref(`/images/${itemImageRef}`)
.onWrite(event => {
const filePath = event.data.val();
const filename = filePath.split('/').pop();
const bucket = gcs.bucket('id.appspot.com');
const remoteWriteStream = bucket.file(filename).createWriteStream({
metadata: { contentType: 'image/jpeg' }
});
request(filePath).pipe(remoteWriteStream)
.on('error', (err) => console.log(err))
.on('finish', () => console.log('success save image'));
});
通过将请求结果直接通过管道传输到存储桶,它通过跳过写入本地文件的步骤解决了问题,我怀疑这是我的原始代码失败的原因。另外,不要忘记为图像设置 contentType。
我想在我的数据库使用 'photo_url' 字段更新时下载图像并将其保存到存储中
exports.saveToStorage = functions.database.ref(`/images/${itemImageRef}`)
.onWrite(event => {
const filePath = event.data.val();
const filename = filePath.split('/').pop();
var download = request.get(filePath).on('error', (err) => {
console.log(err)
})
.pipe(fs.createWriteStream(filename));
download.on('finish', () => {
const bucket = gcs.bucket('id.appspot.com');
const storagePath = `images/${filename}`;
return bucket.upload(download, { destination: storagePath })
.then(() => {
console.log('success upload');
});
});
});
它记录 "Error: EROFS: read-only file system, open 'image.jpg' at Error (native)." 我想我无法检索 createWriteStream 保存的文件? 那么我应该如何从网络上下载图片呢?
使用@Jobsamuel 建议的 post,代码现在可以工作了:
exports.saveToStorage = functions.database.ref(`/images/${itemImageRef}`)
.onWrite(event => {
const filePath = event.data.val();
const filename = filePath.split('/').pop();
const bucket = gcs.bucket('id.appspot.com');
const remoteWriteStream = bucket.file(filename).createWriteStream({
metadata: { contentType: 'image/jpeg' }
});
request(filePath).pipe(remoteWriteStream)
.on('error', (err) => console.log(err))
.on('finish', () => console.log('success save image'));
});
通过将请求结果直接通过管道传输到存储桶,它通过跳过写入本地文件的步骤解决了问题,我怀疑这是我的原始代码失败的原因。另外,不要忘记为图像设置 contentType。