小编典典

使用Flask上传和下载文件

python

我正在尝试使用PythonAnywhere和Flask编写一个非常简单的Web应用程序,该应用程序可以让用户上传文本文件,生成一个csv文件,然后让用户下载csv文件。不必花哨,只需工作即可。我已经编写了从驱动器上的txt文件生成csv的程序。

现在,我的函数使用以下命令在驱动器上打开文件:

with open(INPUTFILE, "r") as fname:

并使用以下代码编写csv:

with open(OUTPUTFILE, 'w') as fname:

其中INPUTFILE和OUTPUTFILE是文件名字符串。

对我来说,将文件作为对象处理,由flask / html以某种方式返回会更好吗?

我不知道该怎么做。我应该如何构造该程序?我需要几个HTML模板?我宁愿在不将文件保存到任何地方的情况下进行处理,但是如果必须将它们保存到PythonAnywhere目录中,则可以。我怎样才能做到这一点?


阅读 248

收藏
2021-01-20

共1个答案

小编典典

这里的PythonAnywhere开发人员。总的来说,这是关于Flask和Web开发的一个好问题,而不是特定于我们的系统,因此,我将尝试给出一个通用的答案,而无需任何特定于我们的内容:-)

为了确定您的问题,我需要知道几件事,因此,我将从列出我正在做的假设入手-如果我对任何假设有误,请给我评论。我将适当地更新答案。

  • 我假设您要上传的文件不是很大,并且可以容纳合理的内存量-假设小于一兆字节。
  • 我假设您已经编写了从文本文件生成CSV的程序,并且该程序具有(或者可能更容易更改为具有)一个函数,该函数需要包含以下内容的字符串:文本文件的内容,并返回需要写入CSV的内容。

如果同时存在这两种情况,那么构造Flask应用程序的最佳方法就是处理Flask中的所有内容。一个代码示例值一千个单词,因此,我整理了一个简单的示例,允许用户上传文本文件,并通过一个名为的函数运行它transform(这是转换程序中的函数插入的位置-
我的替换=,整个文件),然后将结果发送回浏览器。
在PythonAnywhere上有此应用程序的实时版本

from flask import Flask, make_response, request

app = Flask(__name__)

def transform(text_file_contents):
    return text_file_contents.replace("=", ",")


@app.route('/')
def form():
    return """
        <html>
            <body>
                <h1>Transform a file demo</h1>

                <form action="/transform" method="post" enctype="multipart/form-data">
                    <input type="file" name="data_file" />
                    <input type="submit" />
                </form>
            </body>
        </html>
    """

@app.route('/transform', methods=["POST"])
def transform_view():
    request_file = request.files['data_file']
    if not request_file:
        return "No file"

    file_contents = request_file.stream.read().decode("utf-8")

    result = transform(file_contents)

    response = make_response(result)
    response.headers["Content-Disposition"] = "attachment; filename=result.csv"
    return response

关于您的其他问题:

  • 模板:在本示例中,我没有使用模板,因为我希望所有模板都可以放入单个代码中。如果我做得正确,则可以将form视图生成的内容放入模板中,仅此而已。
  • 您可以通过写入文件来做到这一点吗?是的,可以,并且可以使用我正在使用属性的对象上的save( filename)方法保存上载的文件。但是,如果您的文件很小(按照我上面的假设),那么像上面的代码那样在内存中处理它们可能更有意义。file``stream

希望对您有所帮助,如果您有任何疑问,请发表评论。

2021-01-20