【问题标题】:Stream upload file to Azure blob storage with Node and graphql使用 Node 和 graphql 将文件流式上传到 Azure Blob 存储
【发布时间】:2021-01-10 10:28:12
【问题描述】:

我需要使用 nodejs 和 apollo-server-express 将图像存储到 Azure blob 存储。我使用 createBlockBlobFromStream 进行存储,但它需要流长度。如何找到流长度? 有没有更好的方法使用 graphql 将图像存储到 azure blob 存储

uploadImageFunc 由解析器通过传递参数调用

const fs = require('fs')
const azure = require('azure-storage')
const blobService = azure.createBlobService("connection string")


const uploadImageFunc = async function(args) {
    return args.file.then(file => {
        const {createReadStream, filename, mimetype} = file

        const fileStream = createReadStream()
        
        blobService.createBlockBlobFromStream('container-name',filename,fileStream,"fileStream.length",(error,response) => {
          if(!error){
            console.log(response)
          }
        })

        fileStream.pipe(fs.createWriteStream(__dirname+`/uploadedFiles/${filename}`))

        return file;
        
      });
}

module.exports = uploadImageFunc;

感谢回复

【问题讨论】:

标签: node.js azure graphql apollo-server


【解决方案1】:

实际上,流大小存在于请求的内容长度中。 req.headers['content-length'] 的内容长度为字符串。使用 parseInt 将其转换为 int 并将其传递给 createBlockBlobFromStream 函数。

const fs = require('fs')
const { v4: uuidv4 } = require('uuid');
const azure = require('azure-storage')
const blobService = azure.createBlobService(process.env.AZURE_STORAGE_CONNECTION_STRING)

const contestEntryModel = require('../models/contestEntryModel')


const uploadImageFunc = async function(args,{req, res}) {
      return args.file.then ( file => {
        const {createReadStream, filename, mimetype} = file

        let streamSize = parseInt(req.headers['content-length'])

        const fileStream = createReadStream()

        const newFilename = uuidv4()
        
      blobService.createBlockBlobFromStream('<container name>',`${args.contestId}/${newFilename}`,fileStream,streamSize,(error,response) => {
        if(!error){
          let entry = {
            url:`<blobstorage url>/${args.contestId}/${newFilename}`,
            participant: req.userId
          }
          contestEntryModel.findOneAndUpdate({contestId: args.contestId},{$push:{entries:entry}},(err, doc) => {
            console.log("updated")
          })
        }
      })


        return true;
        
      });
    
}

module.exports = uploadImageFunc;

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 2019-05-26
    • 2017-01-24
    • 2017-08-19
    • 1970-01-01
    • 2021-06-20
    • 2021-11-19
    • 2019-10-14
    相关资源
    最近更新 更多