使用Flash上传和下载文件

2024-06-07 16:46:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pythonywhere和Flask编写一个非常简单的webapp,它允许用户上传一个文本文件,生成一个csv文件,然后让用户下载csv文件。它不一定是花哨的,它只需要工作。我已经编写了从驱动器上的txt文件生成csv的程序。

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

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

并使用以下内容编写csv:

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

INPUTFILE和OUTPUTFILE是文件名字符串。

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

我不知道怎么做。我应该如何组织这个程序?我需要多少HTML模板?我更愿意在任何地方都不保存这些文件,但如果我必须将它们保存到PythonAnywhere目录,我可以。我该怎么做?


Tags: 文件csv用户程序flaskaswithopen
2条回答

更好的补充

response.headers["Cache-Control"] = "must-revalidate"
response.headers["Pragma"] = "must-revalidate"
response.headers["Content-type"] = "application/csv"

如果不添加内容类型,FF 48.0会将其报告为html,并为html打开一次保存对话框,然后为CSV打开一次保存对话框。如果不添加缓存控制,则可能会缓存结果,如果提供活动内容,则这不是您想要的。如果您使用must revalidate而不使用age,那么它将有效地用作无缓存—请参见herehere以获取解释。

德夫在哪的Python。这是一个关于Flask和web开发的很好的问题,一般来说不是针对我们的系统的,所以我将尝试给出一个通用的答案,而不是针对我们的任何特定的:-)

有几件事我需要知道才能对你的问题给出一个明确的答案,所以我将首先列出我所做的假设——如果我有任何错误,请给我留言,我会适当地更新答案。

  • 我假设你上传的文件不是很大,可以放入一个合理的内存量——比方说,小于1兆字节。
  • 我假设您已经编写的从文本文件生成CSV的程序是用Python编写的,并且它有(或者,可能更容易更改为有)一个函数,该函数接受包含文本文件内容的字符串,并返回需要写入CSV的内容。

如果这两种情况都存在,那么构建烧瓶应用程序的最佳方法就是处理烧瓶内的所有内容。一个代码示例值一千个字,所以这里有一个简单的示例,它允许用户上传一个文本文件,通过一个名为transform的函数运行它(在这个函数中,转换程序中的函数将插入--我的函数将整个文件中的=替换为,),并将结果发送回浏览器。There's a live version of this app on PythonAnywhere here

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视图生成的东西放到一个模板中,但仅此而已。
  • 可以通过写入文件来完成吗——可以,并且可以通过对我正在使用的file对象使用stream属性的save(filename)方法来保存上载的文件。但是如果你的文件很小(按照我上面的假设),那么像上面的代码那样在内存中处理它们可能更有意义。

我希望这一切都有帮助,如果你有任何问题,请留下评论。

相关问题 更多 >

    热门问题