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
相关产品推荐
相关产品推荐

