Werkzeug FileStorage二次保存为空问题及无重打开解决咨询
问题分析与解决方案
问题根源
Werkzeug的FileStorage对象调用save()方法后,内部的文件指针会移动到文件末尾。此时再对同一个file实例执行save()或读取操作,会从末尾开始,自然获取不到任何内容,导致二次保存的文件为空。
解决办法
方法1:重置文件指针
在第一次save操作后,调用file.seek(0)将指针重置到文件开头,后续操作就能正常读取内容。
修改你的convert_to_blob函数,添加指针重置:
def convert_to_blob(file: file_storage.FileStorage) -> bytes: os_path = os.path.join(config('UPLOAD_CONVERT'), "convert.pdf") file.save(os_path) # 重置文件指针到开头,方便后续复用file对象 file.seek(0) # 直接读取file对象内容,无需重新打开磁盘文件 blobData = file.read() return blobData
之后执行二次保存时,只需确保指针在开头(如果中间有其他读取操作,可能需要再次seek(0)):
# 假设hash_filename是生成的哈希文件名 file.seek(0) file.save(os_path.join(config('UPLOAD_DIR'), hash_filename))
方法2:跳过中间文件,直接读取内容
完全可以省去先保存到磁盘再读取的步骤,直接从FileStorage读取二进制数据,既减少IO开销,也避免指针问题:
def convert_to_blob(file: file_storage.FileStorage) -> bytes: # 先重置指针确保从文件开头读取 file.seek(0) blobData = file.read() # 若需要保存原始文件,读取后再次重置指针 file.seek(0) os_path = os.path.join(config('UPLOAD_CONVERT'), "convert.pdf") file.save(os_path) return blobData
这种方式下,后续二次保存只需再次执行file.seek(0)后调用save()即可。
内容的提问来源于stack exchange,提问作者user3793935
相关产品推荐
相关产品推荐

