使用 Node 和 graphql 将上传文件流式传输到 Azure blob 存储
Stream upload file to Azure blob storage with Node and graphql
我需要使用 nodejs 和 apollo-server-express.I 将图像存储到 Azure blob 存储,我正在使用 createBlockBlobFromStream
进行存储,但它需要流长度。我怎样才能找到流长度?
有没有更好的方法使用 graphql
将图像存储到 azure blob 存储
uploadImageFunc
由解析器通过传递 args
调用
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;
感谢回复
实际上,流大小存在于请求的内容长度中。 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;
我需要使用 nodejs 和 apollo-server-express.I 将图像存储到 Azure blob 存储,我正在使用 createBlockBlobFromStream
进行存储,但它需要流长度。我怎样才能找到流长度?
有没有更好的方法使用 graphql
uploadImageFunc
由解析器通过传递 args
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;
感谢回复
实际上,流大小存在于请求的内容长度中。 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;