@azure/storage-blob uploadStream()仅上传42字节问题求助
问题原因与解决方案
核心问题是你错误地将文件路径字符串转换成了Buffer,而不是读取文件的实际内容。Buffer.from(filePath)只会把路径文本转成字节,这就是为什么上传的总是固定长度(路径字符串的长度)的内容。
修正步骤:
- 用文件读取流获取真实文件内容,替代对路径字符串的处理
- 正确获取文件实际大小,让上传逻辑能识别总字节数
- 调整参数传递逻辑,确保媒体类型正确生效
修正后的代码:
const { BlobServiceClient, StorageSharedKeyCredential } = require("@azure/storage-blob"); const dotenv = require('dotenv'); const fs = require('fs'); const { stat } = require('fs/promises'); dotenv.config(); const account = process.env.STORAGE_ACCOUNT; const accountKey = process.env.ACCOUNT_KEY; const sharedKeyCredential = new StorageSharedKeyCredential(account, accountKey); const blobServiceClient = new BlobServiceClient( `https://${account}.blob.core.windows.net`, sharedKeyCredential ); const containerName = process.env.CONTAINER_NAME; const uploadFile = async(filePath, fileInfo) => { const containerClient = blobServiceClient.getContainerClient(containerName); const blobName = "vimeoVedio" + new Date().getTime(); const blockBlobClient = containerClient.getBlockBlobClient(blobName); // 创建文件读取流,读取真实文件内容 const stream = fs.createReadStream(filePath); // 获取文件实际大小 const fileStats = await stat(filePath); const fileSize = fileStats.size; const uploadBlobResponse = await blockBlobClient.uploadStream( stream, undefined, // 让SDK自动适配分块大小,或手动指定如4*1024*1024(4MB) 400, { onProgress: (ev) => {console.log("progress", ev)}, blobHTTPHeaders: {blobContentType: fileInfo.mimeType} } ); return `Upload block blob ${blobName} successfully, requestId: ${uploadBlobResponse.requestId}`; } module.exports = {uploadFile}
关键修改说明:
- 替换
into-stream处理路径的逻辑为fs.createReadStream:直接读取文件的实际内容,而非路径字符串 - 使用
fs.promises.stat获取文件大小:让上传进度计算更准确,也符合SDK对已知流长度的优化逻辑 - 移除错误的
Buffer.from(filePath):彻底避免上传路径文本的问题 - 可选调整分块大小:视频文件建议使用更大的分块(如4MB),提升上传效率
内容的提问来源于stack exchange,提问作者Sagar47
相关产品推荐
相关产品推荐

