Javascript firebase功能通过流从web上载文件仅部分工作
我正在尝试创建一个firebase函数,通过URL从web下载照片并将其上载到firebase存储 使用Axios将文件流式传输到存储桶。文件似乎已上载,但我无法下载或查看它 这是我的代码:Javascript firebase功能通过流从web上载文件仅部分工作,javascript,node.js,firebase,axios,google-cloud-functions,Javascript,Node.js,Firebase,Axios,Google Cloud Functions,我正在尝试创建一个firebase函数,通过URL从web下载照片并将其上载到firebase存储 使用Axios将文件流式传输到存储桶。文件似乎已上载,但我无法下载或查看它 这是我的代码: let fileURL = 'https://www.example.file.path.png' let myFile = await axios.get(fileURL, { responseType: 'stream' }) let destFile = bucket.file(photoId).c
let fileURL = 'https://www.example.file.path.png'
let myFile = await axios.get(fileURL, { responseType: 'stream' })
let destFile = bucket.file(photoId).createWriteStream({ contentType: myFile.headers['content-type']})
myFile.data.pipe(destFile)
这是firebase的存储控制台:
我弄乱了存储api,并尝试使用上载和保存功能。使用axios get and write streams是我最接近实现这一目标的方法
读取文档中的文件只会有助于我的混淆,因为文件在上传功能中从未被引用。。只是文件名
感觉我差不多就在那里了,考虑到了文件,或者更确切地说,文件的名称,大小和类型。。只是内容不一样?此问题仅与Firebase控制台相关。使用以下命令下载时没有问题:
gsutil cp gs:///yourfile.
(),并且它在存储浏览器()的Google云控制台中工作
然而,像这样上传的文件确实不可能用Firebase控制台下载或预览
经过多次尝试后,我意识到这与自定义元数据访问令牌
有关,其下面称为firebaseStorageDownloadTokens
。如果您直接在Firebase控制台中下载文件,则会自动显示
无论如何,我注意到元数据的值是不相关的。根据我的测试,如果将createWriteStream
方法参数更改为:
let destFile = bucket.file(photoId)
.createWriteStream({
metadata: {
contentType: myFile.headers['content-type'],
metadata: {
firebaseStorageDownloadTokens: 'canBeAnyThing'
}
}
});
问题消失了
已下载到Firebase存储且受此问题影响的文件可以通过添加相同的元数据进行修复。在您提供的屏幕截图中,您可以看到“文件位置”,如果您打开,您将看到“创建新访问令牌”链接,或者您也可以在GCP存储浏览器中添加它,在此类对象的“编辑元数据”中手动添加它(请记住在浏览器中刷新FB控制台)
在这一点上,我们可以想想为什么它看起来像这样。我在github中找到了一些有趣的信息。您没有正确使用节点流api。pipe()不返回承诺。可能需要查看文档:当您尝试下载它时发生了什么?