【问题标题】:Error: "Failed - No file" when downloading a file from app deployed on heroku错误:从部署在 heroku 上的应用程序下载文件时出现“失败 - 无文件”
【发布时间】:2020-10-30 20:31:05
【问题描述】:

我用烧瓶构建了一个非常简单的应用程序,可以在本地主机上完美运行。在主页上,用户可以从链接下载一些 PDF,但是当我尝试对部署在 heroku 上的应用执行相同操作时,它显示“失败 - 无文件”。

应用结构如下:

app.py
resources
         |
         |-- regolamento2019-2020.pdf
         |-- regolamento2019-2020.pdf
templates
static

文件下载的 HTML 是这样的:

        <td>
            <a href="../resources/regolamento2019-2020.pdf" download="Regolamento_2019_2020.pdf">
                <img src="../static/red.png" alt="redKing" width=65 height=65>
            </a>
        </td>

我不明白为什么它在 heroku 上不起作用。我还进入了 heroku 仪表板上的控制台并运行 bash 来查看树结构并检查文件是否存在并且我可以看到它们。我也尝试将路径更改为

<a href="/app/resources/regolamento2019-2020.pdf" download="Regolamento_2019_2020.pdf">

因为 heroku 上的当前目录是 /app。 关于如何解决此问题并使其在线工作而不仅仅是在本地工作的任何想法?

【问题讨论】:

    标签: html flask heroku


    【解决方案1】:

    不要在模板中包含像 ../static/something.jpg 这样的路径。

    改为使用 Flask 的 url_for 函数动态生成这些链接:

    <img src="{{ url_for('static', filename='red.png') }}" alt="redKing" width=65 height=65>
    

    如果您将 resources 目录移动到 static 目录中,您可以这样做:

    <a href="{{ url_for('static', filename='resources/regolamento2019-2020.pdf') }}" download="Regolamento_2019_2020.pdf">Click</a>
    

    悬停在resources 目录的当前位置上,您可以编写自定义路由 (as per the example here),例如:

    from flask import send_from_directory
    
    @app.route('/resources/<path:filename>')
    def download_file(filename):
        return send_from_directory('resources',
                                   filename, as_attachment=True)
    
    

    然后将其包含在您的模板中:

    <a href="{{ url_for('download_file', filename='regolamento2019-2020.pdf') }}">Click</a>
    

    【讨论】:

      猜你喜欢
      • 2019-07-01
      • 1970-01-01
      • 2021-03-25
      • 2017-12-17
      • 2018-05-30
      • 1970-01-01
      • 2020-04-23
      • 2018-08-16
      • 1970-01-01
      相关资源
      最近更新 更多