繁体   English   中英

AJAX发布后使用Flask“ send_from_directory”下载文件的问题

[英]Issue with downloading file using Flask “send_from_directory” after AJAX post

我有一个“查看采购订单”按钮,单击该按钮可发送ajax帖子。 提交帖子后,将从Dropbox下载文件并将其保存到名为“ 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)

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

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)

有时Flask控制台会同时返回两个:

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成功。 我不确定为什么,但是此信息可能会有所帮助。 无论哪种情况,文件都不会开始下载。 编辑:我有它,所以它总是返回excel文件的GET。 我仍然可以使用chrome的开发者工具在“网络”标签中找到并下载。 它仍然不会自动返回文件。

因此,我最终想出了一种解决方法。 如果有人可以对此进行评论,请这样做。 在javascript中,我将ajax成功更改为:

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

现在可以成功下载文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM