【问题标题】:Upload, manipulate, and save files in python flask在 python 烧瓶中上传、操作和保存文件
【发布时间】:2020-11-10 19:01:35
【问题描述】:

我正在尝试使用 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)

我是网络开发的新手,非常感谢任何形式的帮助!

【问题讨论】:

  • 动态的意思是像“/users_data//...”?
  • 是的,例如:我不能假设每个人都有相同的文件夹结构,所以我如何确保将文件保存到用户磁盘上存在的位置:)
  • 我认为您在混淆。你的路由从用户那里接收到一个文件并将其保存在服务器的磁盘上。

标签: python web flask file-upload web-development-server


【解决方案1】:

我猜是误会了。

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

这不是user 的路径。

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

【讨论】:

  • 所以想法是将“路径”设置为我的应用程序文件夹结构中的某个位置?这样它会保存在那里,然后用户可以从那里下载它?
  • 要么这样,要么根本不将文件保存在服务器上,直接处理或转换,立即让用户重新下载。这取决于您的用例。
  • 老实说,我有点困惑。当用户上传文件时,我可以将其保存为 Python 对象并对其进行处理。但是如何使它“可下载”?你提到我根本不用保存在服务器上,听起来很方便。
  • 这能回答你的问题吗? stackoverflow.com/questions/35710361/… 如果不是 - 只需保存文件并执行 send_filesend_from_directory。正如某个聪明人所说..“让它发挥作用,让它正确,让它快速”
  • 感谢您的链接! :) 它确实有帮助,但我仍然卡住/困惑。在我看来,我上传的 csv 被转换为文件存储对象。我可以使用 save 方法将其保存到文件夹,但如果它不是文件存储对象,我不能使用 save 方法。我不确定如何将文件存储对象转换为熊猫数据框,然后再次转换回文件存储对象。
【解决方案2】:

我设法获得了一个符合我想要的行为方式的版本:

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,添加新列,然后再次下载。很确定有更好的选择可以做到这一点,但它有效:)我首先将请求的文件保存在“上传”文件夹中,然后从那里作为熊猫数据框读取它并进行一些基本操作以进行测试,然后我保存它作为 csv 到一个名为“下载”的文件夹。从那里,我可以将其作为附件下载。

感谢您的所有投入!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多