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

