【问题标题】:Issue with downloading file using Flask "send_from_directory" after AJAX post在 AJAX 发布后使用 Flask“send_from_directory”下载文件的问题
【发布时间】:2019-11-22 14:21:12
【问题描述】:

我有一个按钮,“查看采购订单”,点击它会发送一个 ajax 帖子。提交帖子后,将从保管箱下载一个文件并保存到名为“temp_files”的目录中。这个动作效果很好。但是,代码不遵循重定向到下载文件 url。

我已经尝试告诉 ajax 在成功发布后遵循重定向,我还尝试将文件作为附件返回。两者都没有工作。我可以在网络选项卡中找到文件的 URL,我可以双击它并开始下载文件。

这里是处理 AJAX 帖子的路由和文件下载的路由:

@tables_bp.route('/purchase_orders', methods=['GET', 'POST'])
@login_required
def purchase_orders():
    table = 'purchase_orders'
    # populate render_dict which helps make render_template
    # less verbose
    render_dict = helpers.render_args(table)
    # purchase order form creation
    po_form = PurchaseOrderForm()
... some other code ...
    if request.method == 'POST':
        po = request.form['po']
        oath2 = os.environ.get('OATH2')
        po_folder = os.environ.get('PO_FOLDER')
        helpers.Dropbox_Excel_Worker(
            po_folder, po, oath2, PurchaseOrders
        )
        return redirect(url_for('tables.file_view', filename="temp_po.xlsx"))
... other form handlers below ...
@tables_bp.route('/purchase_orders/<filename>', methods=['GET', 'POST'])
@login_required
def file_view(filename):
    return send_from_directory(current_app.config['TEMP_FILES'], filename)

这是成功下载文件并将其保存在 temp_files 目录中的 helpers.Dropbox_Excel_Worker 函数。

def Dropbox_Excel_Worker(file_folder, po_num, oath2, PurchaseOrders):
    file = "/{}.xlsx".format(po_num)
    try:
        dbx = dropbox.Dropbox(oath2)
        metadata, res = dbx.files_download(file_folder + file)

        with closing(res) as result:
            byte_data = res.content
            file_stream = io.BytesIO(byte_data)

        workbook = openpyxl.load_workbook(file_stream)
        application = current_app._get_current_object()
        with application.app_context():
            file_name = secure_filename("temp_po.xlsx")
            temp_file = os.path.join(current_app.config['TEMP_FILES'], file_name)
            workbook.save(temp_file)

有时烧瓶控制台会同时返回:

127.0.0.1 - - [12/Jul/2019 15:49:42] "POST /tables/purchase_orders HTTP/1.1" 302 -
C:\Users\napaf\Desktop\programming\adco_flask\temp_files
127.0.0.1 - - [12/Jul/2019 15:49:42] "GET /tables/purchase_orders/temp_po.xlsx HTTP/1.1" 200 -

其他时候它只返回成功的 POST。我不确定为什么,但这些信息可能会有所帮助。在任何一种情况下,文件都不会开始下载。 编辑:我有它,所以它总是返回 GET 的 excel 文件。我仍然可以使用 chrome 的开发人员工具在网络选项卡中找到并下载它。但它仍然不会自动返回文件。

【问题讨论】:

    标签: python flask download


    【解决方案1】:

    所以我最终想出了一个解决方法。如果有人可以对此的安全性发表评论,请这样做。在 javascript 中,我将 ajax 成功更改为:

    success: function(){
                $('#loadingmessage').hide();
                location.href = "/tables/purchase_orders/temp_po.xlsx";
    

    现在已成功下载文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-08
      • 2010-12-05
      • 2021-05-11
      • 2023-03-30
      • 1970-01-01
      • 2020-08-10
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多