【问题标题】:How to create a downloadable URL for a zip file in Django?如何在 Django 中为 zip 文件创建可下载的 URL?
【发布时间】:2020-01-27 06:13:36
【问题描述】:

我正在尝试创建一个网页,其中包含一个表格,该表格中的一列下载驻留在我的计算机中的特定文件。应该下载的文件是基于该行的 ID 号。(ID 是我表中的一列)

例如。如果用户单击第 3 行中的 URL,则应下载本地文件中名为“3.zip”的文件。

我在我的 HTML 模板文件中尝试了 <a href="<path>" download>,但我意识到在 Django 中方法不同。然后我使用 HTTPResponse 作为附件方法。

这是我的 Views.py 代码供下载。

def download_file(request):
    fl_path = '/home/harish/Desktop/cvision/users_output_files/5/5.zip'
    filename = '5.zip'

    with open(fl_path, 'r') as zip_file:
        response = HttpResponse(zip_file, content_type='application/force-download')
        response['Content-Disposition'] = 'attachment; filename="%s"'%filename
        return response

网址.py

urlpatterns = [
    path('',views.homepage),
    path('add',views.datapage),
    path('newdata',views.newdata),
    path('newuser',views.newuser),
    path('download_file/',views.download_file)
]

所以,当我转到路径 http://127.0.0.1:8000/download_file 时,应该会下载该文件。但相反,我得到了一个错误。

'utf-8' codec can't decode byte 0xeb in position 10: invalid continuation byte

如果我们忽略编码错误,如何解决根据该行的 ID 从本地文件夹下载特定文件的问题?

【问题讨论】:

    标签: python django url


    【解决方案1】:

    我有一个想法,最好将您的文件保存在静态或媒体文件夹中,并将媒体/静态 url 根设置添加到您的 urls.py 文件中

    setting.py

     # Base url to serve media files
    MEDIA_URL = '/media/'
    
    # Path where media is stored
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
    

    urls.py

    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        ...
    ]
    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL,
                              document_root=settings.MEDIA_ROOT)
    

    最后你可以在 django 模板中为你的文件提供链接,如 as

    <a href="{{ STATIC_URL }}/files/somefile"> download</a>
    

    <a href="{{ MEDIA_URL }}/files/somefile"> download</a>
    

    【讨论】:

    • 但是身份证号问题怎么处理呢?此方法未获取 ID 值,以便我可以指定 pirtucular .zip 文件的路径?
    【解决方案2】:

    但是我该如何处理身份证号码问题呢?这种方法不 获取 ID 值,以便我可以指定我的路径到 pirtucular .zip 文件?

    可能你想创建一个像吹一样的表

     {% for student in student_list %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ student.student_id }}</td>
                <td>{{ student.user.first_name }}</td>
                <td>{{ student.user.last_name }}</td>
                <td align="center"><a href="{{ MEDIA_URL }}/files/{{ forloop.counter }}.zip"></a>
            </tr>
        {% endfor %}
    

    {{forloop.counter}} 是你的身份证号

    【讨论】:

    猜你喜欢
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多