Streamlit上传文件调用API报错(被识别为目录)但Postman正常求助
问题排查:Streamlit上传文件被API识别为目录的原因及修复方案
核心问题分析
- 文件参数格式不符合规范:你直接将字节流传入
requests.post的files参数,而API需要的是符合multipart/form-data标准的文件结构(包含文件名、文件内容、MIME类型),错误格式导致API误判为目录。 - 参数混放错误:非文件类型的字段(如
deviceSize、ConsumerID)被放在files字典中,和Postman的请求结构不一致,引发解析异常。 - 潜在代码漏洞:Streamlit代码中
b变量未初始化,且字节流未重置指针,会导致传输空数据。
修正后的代码
Streamlit文件处理部分
import io from PIL import Image import streamlit as st # 类方法片段 if uploaded_file is not None: fname = uploaded_file.name img = Image.open(uploaded_file) col1.image(img) # 初始化BytesIO并重置指针 b = io.BytesIO() img.save(b, 'jpeg') b.seek(0) # 必须重置指针,否则读取内容为空 res = self.request(b, fname) # 同时传入文件名供API识别
API调用部分
import requests class Response(): @staticmethod def crackD(file_obj, filename): # 普通表单参数单独放在data字典 data = { 'deviceSize': '(0.0, 0.0, 375.0, 667.0)', 'ConsumerID': '-100', 'client': 'crackd-api', 'metadata': '{"source": "streamlit_test"}' } # files参数按标准格式封装:键名: (文件名, 文件对象, MIME类型) files = { 'file': (filename, file_obj, 'image/jpeg') } headers = { "cache-control": "no-cache", "x-access-token": "xxx" # 移除Postman-Token,这是Postman专属标识,代码中无需携带 } response = requests.post("YOUR_API_URL", headers=headers, data=data, files=files) return response
关键修改说明
- 规范文件参数格式:将字节流封装为
(filename, file_obj, MIME类型)的元组,让API正确识别为文件资源。 - 拆分参数类型:普通表单字段移至
data参数,和Postman的请求结构对齐(Postman中这些是Form Data而非File)。 - 修复字节流指针:
b.seek(0)确保从BytesIO开头读取内容,避免传输空数据。 - 移除冗余Header:删除
Postman-Token,避免干扰API解析逻辑。
内容的提问来源于stack exchange,提问作者Abdullah Gulam Rasool Mastan
相关产品推荐
相关产品推荐

