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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:57:02