当前位置: 首页 > 知识库问答 >
问题:

在通过云功能向云存储添加文件后,是什么原因导致firebase控制台显示“等待”图标(旋转蓝色循环图标)?

狄海
2023-03-14

因此,我现在可以使用谷歌云功能在云存储中存储文件,上传文件后,我可以在Firebase控制台中看到它的名称,即在存储区域中,通过各种文件夹向下钻取。

我还可以查询和检索并查看文件,因此它看起来存储得很好。

但是,我不明白为什么不能在firebase控制台中单击该文件并查看其预览。

我唯一的猜测是,上传文件的云函数没有释放文件句柄之类的东西,所以firebase控制台认为它被锁定了。

Firebase控制台中显示的文件属性似乎是正确的。

上传文件的云功能代码如下:

const imageBuffer = Buffer.from(arr[1], 'base64');
const bufferStream = new stream.PassThrough();
bufferStream.end(imageBuffer);

const fullPath = `${filePath}/${data.filename}`

console.log('saving to fullPath', fullPath)

const myFile = bucket.file(fullPath)

bufferStream.pipe(myFile.createWriteStream({
       metadata: {
         contentType: mime
       },
       public: true,
       validation: "md5"
    }))
     .on('error', function (err) {
      console.log('error from image upload', err);
    })
    .on('finish', function () {
       console.log('!!!!!! finished')
     })

其中arr[1]是字符串的base 64部分,即从一开始就删除mime类型,因此arr[1]是作为base 64的纯文件数据。

所以,基本上一切似乎是完美的工作,除了Firebase控制台不能查看文件,除非我做一个应用程序重新部署,即npm运行构建

共有2个答案

昝晗昱
2023-03-14

再次讨论这个问题,您可以直接将缓冲区写入流本身,而不是使用增加不必要开销的PassThrough流。

const imageBuffer = Buffer.from(arr[1], 'base64');

const fullPath = `${filePath}/${data.filename}`

console.log('saving to fullPath', fullPath)

const myFile = bucket.file(fullPath)

const fileWriteStream = myFile
  .createWriteStream({
    metadata: {
      contentType: mime
    },
    public: true,
    validation: "md5"
  })
  .on('error', function (err) {
    console.log('error from image upload', err);
  })
  .on('finish', function () {
    console.log('!!!!!! finished')
  });
  
fileWriteStream.end(imageBuffer);

改写为基于promise的效用函数:

import { File } from "@google-cloud/storage";
import { storage } from "firebase-admin";

async function uploadDataURI(dataURI: string, options: { bucket?: string, filename: string, filepath: string, public?: boolean, contentType?: string }): Promise<File> {
  const { bucket, filename, filepath, public, contentType } = options;

  const [, mediaType, data] = dataURI.split(/[;,]/);

  let contentTypeFromURI: string, buffer: Buffer;
  if (mediaType.endsWith(";base64")) {
    contentTypeFromURI = mediaType.slice(0,-7);
    buffer = Buffer.from(data, "base64");
  } else {
    contentTypeFromURI = mediaType;
    buffer = Buffer.from(decodeURIComponent(data));
  }

  const storageRef = storage()
    .bucket(bucket)
    .file(`${filepath}/${filename}`);
    
  return new Promise((resolve, reject) => {
    try {
      const fileWriteStream = storageRef
        .createWriteStream({
          metadata: {
            contentType: contentType || contentTypeFromURI || undefined // coerce falsy values to undefined
          },
          public,
          validation: "md5"
        })
        .on('error', reject)
        .on('finish', () => resolve(storageRef));
      
      fileWriteStream.end(buffer);
    } catch (err) {
      reject(err);
    }
  }); 
}
韦寒
2023-03-14

根据注释在数据末尾发送null可以解决此问题。

 类似资料:
  • null 云存储桶是云功能工作所必需的吗?如果没有,我怎么能回到这些变化发生之前的地方。请引导我。

  • 我在firebase云功能中遇到了一个情况,其中只有第一个控制台。执行日志或firestore更新语句。 我还有其他类似的函数,在处理响应的方式上略有不同,但这没有任何问题 我已经检查了谷歌云控制台/Firebase控制台等,源代码似乎已经正确上传 我看到了另一个与这种情况相反的帖子。有人知道为什么会这样吗?

  • 在我的应用中,我提示用户捕获图像。用户相机活动在按钮单击时开始,用户可以选择使用相机捕获图像。 此图像保存在用户手机上。然后将图像上传到firebase Storage,一切正常。来自一位使用三星Note 8的用户的反馈是,当图像以肖像模式拍摄时,他稍后会在应用程序中以风景模式显示。 我查看了firebase存储,发现图像以横向模式保存在存储中,即使用户以纵向模式捕获图像。 我想我必须将元数据传递

  • 然后我更改了流,在sendOrderEmail函数中,我还从bucket中新创建的文件打开一个新的读取流。 现在我在附件中至少得到了PDF的一些内容,但从来没有完整的内容。 当我检查上传到bucket的PDF时,它看起来应该。 null null 谁能告诉我我做错了什么,或者提供一个工作的例子,它使用当前的包版本,为这个用途? 这是让我抓狂的代码...

  • 我已经使用谷歌云控制台将几个文件上传到了谷歌云存储的同一个文件夹中。我现在想把几个文件移动到谷歌云存储中的一个新创建的文件夹中,但我无法通过谷歌云控制台看到如何做到这一点。我通过上的命令提示符指令找到了移动文件的说明。但是,我对命令行界面不满意,并且无法在我的机器上使用。 有没有办法通过谷歌云控制台将谷歌云存储中的文件从一个文件夹移动到另一个文件夹?

  • 我正在运行基于Firebase实时数据库和Firebase Storage的网络应用程序。 我需要通过Python google云存储库每小时将新图像上传到Firebase google bucket。这是文件。 我的图片上传代码(img_src路径正确): 图像似乎已成功上传,但在Firebase存储中手动查看时,图像不会加载。所有图像的规格看起来都是正确的。请将手动上传图像(加载良好)的规格与