使用Postman以form-data传图至Azure Blob Storage返回200但未存储,求解决
解决form-data格式上传Azure Blob Storage返回200但无文件的问题
核心原因
Azure Blob Storage的原生REST API(如Put Blob)不支持直接接收form-data格式的请求。你直接用form-data调用Blob API时,返回200仅代表请求被服务端接收,但实际上传的是form-data的结构化文本(包含边界、文件头信息等),并非真正的图片文件;甚至可能因格式不匹配,Blob服务未写入有效内容,导致容器内看不到图片。
必须的解决思路:通过中间服务中转
由于前端要求用form-data,需搭建中间服务接收form-data请求,解析出图片后再上传到Blob Storage。以下是两种低成本实现方案:
方案1:Azure Function中转(轻量快速)
创建HTTP触发的Azure Function,以Node.js为例:
- 安装依赖:
npm install multer @azure/storage-blob(multer用于解析form-data) - 编写Function代码:
const multer = require('multer'); const { BlobServiceClient } = require('@azure/storage-blob'); const upload = multer({ storage: multer.memoryStorage() }); module.exports = async function (context, req) { upload.single('file')(req, {}, async function(err) { if (err) { context.res = { status: 400, body: '解析form-data失败' }; return; } if (!req.file) { context.res = { status: 400, body: '未上传文件' }; return; } const blobServiceClient = BlobServiceClient.fromConnectionString(process.env.AZURE_STORAGE_CONNECTION_STRING); const containerClient = blobServiceClient.getContainerClient('你的容器名称'); const blobClient = containerClient.getBlockBlobClient(req.file.originalname); await blobClient.uploadData(req.file.buffer, { blobHTTPHeaders: { blobContentType: req.file.mimetype } }); context.res = { status: 200, body: `文件上传成功:${req.file.originalname}` }; }); }; - 在Function配置面板添加
AZURE_STORAGE_CONNECTION_STRING(从Blob Storage的访问密钥页复制)
- 安装依赖:
Postman测试:
- 请求方法:POST
- 请求URL:Azure Function的触发地址
- Body选择
form-data,Key设为file,Type选File,Value选择本地图片 - 发送请求后,即可在Blob容器中看到上传的图片
方案2:Azure App Service中转(适合复杂业务)
以Python Flask为例:
- 安装依赖:
pip install flask azure-storage-blob - 编写Flask代码:
from flask import Flask, request from azure.storage.blob import BlobServiceClient app = Flask(__name__) CONNECTION_STRING = "你的Blob存储连接字符串" CONTAINER_NAME = "你的容器名称" @app.route('/upload', methods=['POST']) def upload_file(): if 'file' not in request.files: return "未检测到上传文件", 400 file = request.files['file'] if file.filename == '': return "文件名不能为空", 400 blob_service_client = BlobServiceClient.from_connection_string(CONNECTION_STRING) container_client = blob_service_client.get_container_client(CONTAINER_NAME) blob_client = container_client.get_blob_client(file.filename) blob_client.upload_blob(file, overwrite=True, content_type=file.content_type) return f"文件 {file.filename} 上传完成", 200 if __name__ == '__main__': app.run() - 部署到App Service后,用Postman以form-data格式请求
/upload接口即可完成上传
额外排查点(若中转后仍失败)
- 检查Blob容器权限:若使用连接字符串则无需调整;若用SAS令牌,需确保令牌包含
写入权限 - 检查文件大小限制:Azure Function默认最大请求100MB,大文件需修改Function的
maxOutstandingRequests等配置 - 查看服务端日志:在Azure Function/App Service的日志面板中排查是否有解析失败、Blob上传报错等信息
内容的提问来源于stack exchange,提问作者Jawaharlal
相关产品推荐
相关产品推荐

