PythonFlask-上传、处理和发送文件(csv、xlsx、pdf和word)-最佳实践

PythonFlask-上传、处理和发送文件(csv、xlsx、pdf和word)-最佳实践,flask,file-upload,uploading,sendfile,Flask,File Upload,Uploading,Sendfile,我想知道是否有人可以指导我在以下情况下的最佳实践: 我正在编写一个flask应用程序,我希望用户每两周或每月向我发送一次文件,其中的文件可以是csv、xlsx、pdf或word。这些文件具有特定于客户端的敏感数据,因此,这些文件的安全性是最重要的 我知道这是一个相当长的问题,所以我想为此提前道歉。 以下是我用来帮助回答问题的一些在线资源。其中一些很有帮助,另一些我发现非常复杂。 1. 2. 3. 4. 5. 在经历了多个堆栈溢出响应之后,我了解到基本上有多种方法可以做到这一点: 答:一种方法是

我想知道是否有人可以指导我在以下情况下的最佳实践: 我正在编写一个flask应用程序,我希望用户每两周或每月向我发送一次文件,其中的文件可以是csv、xlsx、pdf或word。这些文件具有特定于客户端的敏感数据,因此,这些文件的安全性是最重要的

我知道这是一个相当长的问题,所以我想为此提前道歉。 以下是我用来帮助回答问题的一些在线资源。其中一些很有帮助,另一些我发现非常复杂。 1. 2. 3. 4. 5.

在经历了多个堆栈溢出响应之后,我了解到基本上有多种方法可以做到这一点: 答:一种方法是将用户的不方便文件保存在与我的application.py文件所在目录相同的文件夹中。就像使用下面的语法一样

UPLOAD_FOLDER = os.path.dirname(os.path.abspath(__file__)) + '/uploads/'
return send_from_directory('UPLOAD_FOLDER/processed_filename.csv', as_attachment=True)
file = request.files["file"]
stream = codecs.iterdecode(file.stream, 'utf-8')
一旦文件在这个“上传”文件夹中,我将能够访问它,并使用以下语法处理它,如果它允许csv文件

with open('UPLOAD_FOLDER/filename.csv') as csv_file:
    file = csv.reader(csv_file)
处理完文件后,我将能够使用新文件名将处理后的文件保存在UPLOAD_文件夹中。 我将能够使用以下语法将文件的输出发送回用户

UPLOAD_FOLDER = os.path.dirname(os.path.abspath(__file__)) + '/uploads/'
return send_from_directory('UPLOAD_FOLDER/processed_filename.csv', as_attachment=True)
file = request.files["file"]
stream = codecs.iterdecode(file.stream, 'utf-8')
有人能给我解释一下吗

i) 当我在本地托管应用程序时,此过程似乎有效。但是,部署此web应用程序时会发生什么情况?什么是
UPLOAD\u FOLDER=os.path.dirname(os.path.abspath(\uu file\uu))+'/uploads/'
将返回?本质上,我试图理解应用程序的绝对路径是什么?这是否会导致用户将文件上传到我用来部署web应用程序的公司服务器的某个位置

ii)考虑到我使用的是敏感的客户信息,这种方法具体涉及哪些主要安全风险

iii)如果我假设上传和处理的文件将保存在我用来部署web应用程序的公司的服务器上,这是否意味着这将是一种非常昂贵的执行此任务的方法?也就是说,我会占用大量的服务器空间来保存上传的文件,然后由我的应用程序处理

B.我遇到的另一种方法基本上是将上传文件的内容存储到流中。我不能完全确定python中的流是什么(尽管我花了很多时间阅读文档)。 对于此方法,我将使用
enctype=“multipart/form data”
创建一个html表单,以便它可以接受文件。一旦用户上传文件,我将使用以下语法将文件内容存储在流中

UPLOAD_FOLDER = os.path.dirname(os.path.abspath(__file__)) + '/uploads/'
return send_from_directory('UPLOAD_FOLDER/processed_filename.csv', as_attachment=True)
file = request.files["file"]
stream = codecs.iterdecode(file.stream, 'utf-8')
我最终将能够使用以下语法读取和处理流的内容:

with open(stream, "w") as csv_file:
    file = csv.reader(csv_file)
我最终将使用以下语法将处理后的文件发送回客户端给用户: 我假设我已经创建了处理过的文件,它被称为“processedfilename.csv”

请有人解释一下:

i) 我更喜欢这种方法,因为我不必将用户上传的文件或处理过的文件保存到任何物理位置。我对这种方法的理解是否正确(即,使用这种方法,我不会在客户机文件系统或服务器中存储任何文件)

ii)我在一个stackoverflow响应中在线阅读到,stream对它可以读取的量有限制,如果文件大小太大,则此方法可能无法工作。我相信在那个回复上显示的限制是16KB左右。我的客户肯定会发送大于此文件大小的文件