File upload Flask从\u目录发送\u

File upload Flask从\u目录发送\u,file-upload,flask,download,File Upload,Flask,Download,我有一个Flask web应用程序,允许用户上传文件,然后下载或在浏览器中显示。在生产过程中,我是否应该使用send\u from\u directory从服务器上的上载文件夹中提供这些文件?您最好让nginx提供静态文件。众所周知,flask在此任务中的性能相对较差。但是,如果您的服务器不能得到充分利用,这并不重要。我已经实现了这种想法。我在用烧瓶休息。但是你可以把它作为参考。 用于上传文件 从document\u folder.config导入目录\u路径 file=data['file']

我有一个Flask web应用程序,允许用户上传文件,然后下载或在浏览器中显示。在生产过程中,我是否应该使用
send\u from\u directory
从服务器上的上载文件夹中提供这些文件?

您最好让nginx提供静态文件。众所周知,flask在此任务中的性能相对较差。但是,如果您的服务器不能得到充分利用,这并不重要。

我已经实现了这种想法。我在用烧瓶休息。但是你可以把它作为参考。 用于上传文件

从document\u folder.config导入目录\u路径
file=data['file']#数据是一个解析。
filename=werkzeug.secure\u文件名(file.filename)
file.save(os.path.join(str(dir\u path),str(filename))

config.py用于文档静态文件夹。将其放置在文档静态文件夹中

导入操作系统
dir\u path=os.path.dirname(os.path.realpath(\u文件\u))

用于下载 您必须将文档的名称保存到数据库中,以便下载文档

docu=DocumentModel.exists(\u id)
如果是docu:
filename=docu.filename
返回send\u file(os.path.join(dir\u path,filename),作为\u attachment=True)

解析器应该是这样的

parser.add_参数('file',
类型=werkzeug.datastructures.FileStorage,
位置class='files'

)

这一切都取决于您的使用案例-如果您需要验证用户是否允许访问文件,那么是的,您将希望使用
send\u from\u directory
。如果任何人都应该能够访问这些文件,那么我只需让代理服务器提供
upload
目录的内容。谢谢,有什么需要吗这样做的显著缺点?为了安全起见,我宁愿使用从目录发送,而不是使用文档id为的服务器文件路径,因为上传的文件是特定于用户的。
send\u from\u directory
可能较慢(因为它必须经过另一层路由)。但是,如果您需要身份验证,则将其集中在应用程序中可能是最简单的方法(除非您提供大量文件,否则差异不会很大)。@SeanVieira注意,
send_from_directory()
不会神奇地猜测不同的标题,它会设置
缓存控制:public,
。因此,如果使用
从\u目录()发送\u
要发送经过身份验证的文件,您可能需要设置一些附加选项。至少如果您使用未加密的HTTP,它允许缓存代理。好的观点-
send\u from\u directory
返回一个
Response
,因此如果您
Response=send\u from\u directory(…);Response.headers['Cache-Control']