You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Streamlit上传文件调用API报错(被识别为目录)但Postman正常求助

问题排查:Streamlit上传文件被API识别为目录的原因及修复方案

核心问题分析

  1. 文件参数格式不符合规范:你直接将字节流传入requests.post的files参数,而API需要的是符合multipart/form-data标准的文件结构(包含文件名、文件内容、MIME类型),错误格式导致API误判为目录。
  2. 参数混放错误:非文件类型的字段(如deviceSize、ConsumerID)被放在files字典中,和Postman的请求结构不一致,引发解析异常。
  3. 潜在代码漏洞: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:58:13