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

如何在Flask框架中用textract无本地存储解析用户上传的PDF/DOC文件

解决Flask FileStorage对象无需保存即可被textract解析的问题

嘿,这个场景我太熟悉了!其实完全不用把文件存到服务器上,textract的process()方法支持直接处理类文件对象(file-like objects),咱们只需要把Flask的FileStorage对象转成它能识别的格式就行,具体步骤如下:

核心思路

FileStorage对象自带read()方法可以直接读取字节内容,我们用BytesIO把这些字节包装成类文件对象,再配合文件扩展名传给textract就搞定了。

修改后的完整代码

from flask import Flask, request
from io import BytesIO
import textract

UPLOAD_FOLDER = 'user_uploads'
ALLOWED_EXTENSIONS = set(['txt', 'pdf','doc','docx', 'png', 'jpg', 'jpeg', 'gif'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# 优化扩展名验证逻辑,支持像docx这种4位后缀
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file and allowed_file(file.filename):
            print(f"File uploaded successfully. File name is {file.filename}")
            
            # 关键步骤:无需保存,直接处理
            # 1. 读取FileStorage的字节内容
            file_bytes = file.read()
            # 2. 包装成BytesIO类文件对象
            file_io = BytesIO(file_bytes)
            # 3. 获取正确的文件扩展名
            file_ext = file.filename.rsplit('.', 1)[1].lower()
            # 4. 用textract解析
            try:
                extracted_text = textract.process(file_io, extension=file_ext)
                # 这里可以返回解析后的文本,比如转成字符串
                return extracted_text.decode('utf-8')
            except Exception as e:
                return f"解析出错: {str(e)}"
    return '''
    <!doctype html>
    <title>Upload new File</title>
    <h1>Upload new File</h1>
    <form method=post enctype=multipart/form-data>
      <input type=file name=file>
      <input type=submit value=Upload>
    </form>
    '''

注意事项

  • 一定要指定extension参数:textract需要通过扩展名来选择对应的解析工具(比如用pdftotext处理PDF,antiword处理DOC等),否则可能无法正确解析。
  • 优化了allowed_file函数:原来的filename[-3:]会漏掉像docx这样的4位后缀,用rsplit('.', 1)[1]能准确获取最后一个扩展名。
  • 异常处理:解析过程中可能遇到各种问题(比如缺少依赖工具、文件损坏),记得加try-except捕获错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:15:31