使用 Node 和 graphql 将文件流式上传到 Azure Blob 存储

Posted

技术标签:

【中文标题】使用 Node 和 graphql 将文件流式上传到 Azure Blob 存储【英文标题】:Stream upload file to Azure blob storage with Node and graphql 【发布时间】: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;

感谢回复

【问题讨论】:

你试过这个***.com/a/18384827/13308381吗? 【参考方案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;

【讨论】:

以上是关于使用 Node 和 graphql 将文件流式上传到 Azure Blob 存储的主要内容,如果未能解决你的问题,请参考以下文章

使用 node js 实时流式传输 MP3 文件

无法使用 GraphQL 和 Apollo 将文件上传到 Strapi

GraphQL 服务器端流式实现

如何使用 axios 将文件上传到使用 graphql-upload 实现的 graphql 后端?

nodejs问题将graphql上传文件发送到服务

在 Node 中使用“fs”,我将如何流式传输 CSV 文件?