使用Firebase功能将表单发布的图像缓冲区上传到Cloud Storage

时间:2018-06-25 15:04:40

标签: firebase google-cloud-storage google-cloud-functions

这是我的云功能。应该可以获取http发布的图片,并将其上传到存储设备,并返回url。

exports.uploadImageToEditor = functions.https.onRequest((req, res) => {
        const img = JSON.parse(JSON.stringify(req.body));
        const bucket = admin.storage().bucket();

        return bucket.file('blog/foo.jpg').save(img.data, { 
          resumable: false, 
          metadata: { 
            contentType: 'image/jpeg' 
          } 
        })
          .then(() => {
              return cors(req, res, () => {
                  res.status(200).send({ "url": bucket.file('foo.jpg').getSignedUrl()});
                });
            });
    });

这是在客户端中实际发送图像的方式:

uploadImage(file, endPoint) {
        if (!endPoint) {
            throw new Error('Image Endpoint isn`t provided or invalid');
        }
        const                  formData = new FormData();
        if (file) {
            formData.append('file', file);
            const                  req = new HttpRequest('POST', endPoint, formData, {
                reportProgress: true
            });
            return this._http.request(req);
        }
        else {
            throw new Error('Invalid Image');
        }
    }

3 个答案:

答案 0 :(得分:1)

我认为您可能正在Admin SDK的File上寻找save()方法。

const bucket = admin.storage().bucket()
  .file('my-file.jpg').save(blob)
  .then(() => { /* ... */ });

答案 1 :(得分:0)

如果出现权限错误,请转到Firebase存储规则并添加此规则以允许在目录中写入:

service firebase.storage {
  match /b/{bucket}/o {
    match /blog/{anyPath=**} {
      allow read;
      allow write;
    }
  }
}

答案 2 :(得分:0)

您也可以通过这种方式获取有关文件的信息。

export const uploadImage = async (destination: string, image: Buffer) => {
  const file = storage.bucket().file(destination);
  await file.save(image, { contentType: yourContentType });
  return file.publicUrl();
};