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

Python/Flask中XML解析与Azure上传同函数执行异常求助

问题根源

Flask通过request.files返回的FileStorage是类文件对象,它的读取指针会随着操作移动:

  • 当你用xmltodict.parse(file)解析时,指针会移动到文件末尾,后续再将同一个file对象传给Azure上传接口时,读取的是空内容,导致上传异常;
  • 反过来先上传再解析,指针同样停在末尾,解析时没有可读内容,就会抛出No element found: line 1, column 0错误。

单独执行解析或上传时,指针只需要移动一次,所以不会出问题,但连续操作同一个对象就会触发指针位置的问题。

可行解决方案

方案1:重置文件指针

每次操作完FileStorage对象后,调用seek(0)将指针重置到文件开头,这样后续操作可以重新读取内容:

import xmltodict
def function1():
    files = request.files.getlist("file")
    for file in files:
        # 解析XML
        doc = xmltodict.parse(file)
        # 重置文件指针到起始位置
        file.seek(0)
        # 上传至Azure
        blobname = azure.blob_upload(file)

方案2:将文件内容读入内存(更稳妥)

直接把文件内容一次性读入内存,用内存中的数据分别做解析和上传,彻底避免指针问题,适合小文件场景:

import xmltodict
from xml.parsers.expat import ExpatError

def function1():
    files = request.files.getlist("file")
    for file in files:
        # 读取文件内容到内存
        file_content = file.read()
        try:
            # 解析XML验证格式
            doc = xmltodict.parse(file_content)
        except ExpatError as e:
            # 格式错误时返回提示
            return f"XML格式无效: {str(e)}", 400
        # 验证通过后上传至Azure
        blobname = azure.blob_upload(file_content, file.filename)

同时需要修正blob_upload函数的文件名问题(原代码中blob_name未定义):

from azure.storage.blob import BlobServiceClient
service = BlobServiceClient(account_url="url", credential="key")
container = service.get_container_client("container")

def blob_upload(data, blob_name):
    blob = container.get_blob_client(blob_name)
    blob.upload_blob(data)
    return blob_name

内容的提问来源于stack exchange,提问作者rikitikitik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:56:08