在python flask中上载、操作和保存文件

2024-05-07 18:29:24 发布

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

我正在尝试用Flask创建一个简单的web应用程序。目标是让用户能够上传一个文件(在我的例子中是.csv),然后对其进行处理,最后将处理后的文件保存到用户的计算机上

到目前为止,我可以从浏览器中选择文件并上传。我将其保存为Python对象,也可以直接将其保存到我的个人下载文件夹中。但是,我不明白如何使下载路径动态化。如果我部署应用程序,每个人都应该能够将处理后的文件直接下载到各自的文件夹中。这是怎么回事

下面是我的代码:

from flask import Flask, render_template, request, redirect
import os

app = Flask(__name__)


@app.route("/")
def home():
    return render_template("index.html")


@app.route("/upload-csv", methods=["GET", "POST"])
def uplaod_csv():

    if request.method == "POST":

        if  request.files:

            csv = request.files["csv"]

            path = "this should be dynamic"
            csv.save(os.path.join(path, csv.filename))

            return redirect(request.url)

    return render_template("index.html")

if __name__ == "__main__":
    app.run(debug=True)

我是一个网络开发新手,非常感谢您的帮助


Tags: 文件csvpath用户import文件夹app应用程序
2条回答

我想是误会了

csv.save(os.path.join(path, csv.filename))-这将文件保存在服务器上-当您开发应用程序时,即您的计算机

这不是user的路径

用户路径是用户浏览器中的设置。通常是“downloads”目录,或者用户会被问到保存下载的位置

我设法得到了一个符合我要求的版本:

from flask import Flask, render_template, request, redirect, url_for, send_from_directory
import os
import pandas as pd

app = Flask(__name__)

@app.route("/")
def home():
    return render_template("index.html")


@app.route("/upload-csv", methods=["GET", "POST"])
def upload_csv():

    if request.method == "POST":

        if request.files:

            csv_upload = request.files["csv"]
            filename = csv_upload.filename
            csv_upload.save(os.path.join("uploads", csv_upload.filename))

            path = os.path.join("uploads", csv_upload.filename)
            df = pd.read_csv(path)
            new_column = range(12343)
            df['new_column'] = new_column
            df.to_csv(os.path.join("downloads", filename))

            return redirect(url_for('uploaded_file', filename=filename))

    return render_template("index.html")


@app.route("/uploads/<filename>")
def uploaded_file(filename):
    filename_processed = 'processed' + '-' + filename
    return send_from_directory("downloads", filename, as_attachment=True, attachment_filename=filename_processed)


if __name__ == "__main__":
    app.run(debug=True)

我现在可以上传一个csv,添加一个新的专栏,然后再次下载。很确定有更好的方法可以做到这一点,但它是有效的:)我首先将请求的文件保存在“uploads”文件夹中,然后将其作为pandas数据帧从那里读取,并进行一些基本的测试操作,然后将其作为csv保存到一个名为“downloads”的文件夹中。从那里,我可以下载它作为附件

谢谢你的所有投入

相关问题 更多 >