Flask POST传文件给Textract报错:TypeError类型转换问题
解决textract.process() 传入BytesIO时的TypeError问题
我明白你折腾一周的烦恼——这个错误其实是因为textract.process()的参数要求和你想的不一样。
错误原因
textract.process() 并不支持直接传入BytesIO对象。它的设计目标是接受两种类型的输入:
- 一个文件系统路径的字符串(比如
./test.pdf) - 一个实现了标准文件接口的对象,但这个对象必须能被textract底层依赖的外部工具(比如pdftotext、antiword等)识别——而
BytesIO显然不在此列,因为这些工具需要真实的文件路径来读取内容。
解决方案:两种可行的实现方式
方案1:使用临时文件(推荐,兼容所有文件类型)
因为textract处理非文本文件(PDF、Word、Excel等)时依赖外部工具,这些工具几乎都需要真实的文件路径。我们可以把上传的文件先写入临时文件,处理完再删除:
import os import tempfile from flask import Flask, request import textract app = Flask(__name__) @app.route('/input', methods=['POST']) def input(): request_file = request.files.get('file') if not request_file: return "No file uploaded", 400 # 创建临时文件,delete=False确保处理完前不被自动删除 with tempfile.NamedTemporaryFile(delete=False) as temp_file: temp_file.write(request_file.read()) temp_file_path = temp_file.name try: # 用临时文件路径调用textract extracted_text = textract.process(temp_file_path) return extracted_text finally: # 无论成功失败,都删除临时文件 os.unlink(temp_file_path)
方案2:直接传入FileStorage对象(仅部分文本文件可能有效)
Flask的request.files.get('file')返回的是FileStorage对象,它本身实现了文件接口。如果你的文件是纯文本类(比如.txt),可以试试直接传入,但要确保文件指针在开头:
from flask import Flask, request import textract app = Flask(__name__) @app.route('/input', methods=['POST']) def input(): request_file = request.files.get('file') if not request_file: return "No file uploaded", 400 # 重置文件指针到开头,避免读取为空 request_file.seek(0) extracted_text = textract.process(request_file) return extracted_text
额外测试建议
你之前用send_file做测试,可以先在路由里添加简单的验证,确认文件确实被正确接收:
print(f"Received file: {request_file.filename}, content type: {request_file.content_type}")
这样能快速排除“文件没上传成功”这类基础问题。
内容的提问来源于stack exchange,提问作者jane1912
相关产品推荐
相关产品推荐

