【问题标题】:Firebase storage: Image file types not showing after upload. How do I use the image?Firebase 存储:上传后不显示图像文件类型。如何使用图像?
【发布时间】:2016-12-30 17:33:42
【问题描述】:

当我使用 google-cloud 或 multer-gcs 之类的 npm 包将文件上传到 firebase 存储桶(在后台使用 google 云存储)时,文件会被上传。但是,该文件不显示图像类型(MIME)。另外,如何在我的 node.js 应用程序中使用图像?

这是将图片上传到 Firebase 存储桶的代码。使用multer处理文件上传..

var path = require('path');
var multer = require('multer');
var gcs = require( 'multer-gcs' );

var storage = gcs({
    filename    : function( req, file, cb ) {
        cb( null, file.fieldname + '-' + Date.now() + path.extname(file.originalname).toLowerCase());
    },
    bucket      : 'p****n-bcXX3.appspot.com', // Required : bucket name to upload 
    projectId   : 'p****n-bcXX3', // Required : Google project ID 
    keyFilename: './p****n-5cbc725XXXXd.json', // Required : JSON credentials file for Google Cloud Storage 
    acl : 'publicread' // Optional : Defaults to private 
});

在我的路线中:

router.post('/food/create', [authChecker, gcsUpload.single('food_image')], function(req, res, next) {
    Controllers.create_food(req, res);
});

当我将文件直接上传到存储桶时,类型显示清楚。这里有什么问题?

【问题讨论】:

    标签: node.js express firebase google-cloud-storage firebase-storage


    【解决方案1】:

    看起来multer-gcs 不支持将自定义元数据添加到文件的功能。如果你直接使用gcloud,你会这样做:

    var options = {
      destination: 'new-image.png',
      metadata: {
        contentType: 'image/png'
      }
    };
    
    bucket.upload('local-image.png', options, function(err, file) {
      // Your bucket now contains:
      // - "new-image.png" (with the contents of `local-image.png')
    
      // `file` is an instance of a File object that refers to your new file.
    });
    

    我会向 multer 的开发人员提出问题,并要求他们支持边上传 Blob 的元数据上传,特别是因为 gcloud 已经支持这样做的能力。

    【讨论】:

    • 谢谢。我没有在选项中使用metadata。但是,在明确设置这些选项后,我现在可以更新 firebase 上的文件类型元数据。我还需要将 predefinedAcl 选项设置为 'publicread' 以使任何人都可以看到公共 url 并在任何浏览器上呈现。事实上,我需要使用 createWriteStream 中的选项而不是 bucket.upload 方法中的选项,因为我正在使用 multer 上传文件并将其作为 blob 接收。非常感谢您的精彩提示。
    【解决方案2】:

    这是我现在正在做的处理文件上传的事情。

    req.file.modifiedname = (Math.random().toString(36)+'00000000000000000').slice(2, 10) + Date.now() + path.extname(req.file.originalname);
    var options = {
      metadata: {
        contentType: req.file.mimetype
      },
      predefinedAcl : 'publicread'
    };
    
    var blob = bucket.file(req.file.modifiedname);
    var blobStream = blob.createWriteStream(options);
    
    blobStream.on('error', function (err) {
      return next(err);
    });
    
    blobStream.on('finish', function() {
      publicUrl = format(
        'https://storage.googleapis.com/%s/%s',
        bucket.name, blob.name
      );
      req.file.gcsfileurl = publicUrl;
      console.log(req.file.gcsfileurl);
      next();
    });
    
    blobStream.end(req.file.buffer);
    

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2021-10-12
      • 2020-07-10
      • 1970-01-01
      • 2017-01-11
      • 2015-06-02
      相关资源
      最近更新 更多