TransWikia.com

Djangoサーバー ファイルのダウンロード

スタック・オーバーフロー Asked by Laurentech on December 18, 2020

ご閲覧ありがとうございます。
非常に初歩的な質問で恐縮ですが、質問させていただきます。
現在、DjangoでWebAPIの開発を行っており、ファイルを扱いたいと考えています。
そこで、下記サイトを参考にファイルのダウンロード周りを整えております。
https://pc.atsuhiro-me.net/entry/2014/09/28/140421

このとき、ブラウザから特定のURLにアクセスするとファイルのダウンロードが行われるのでしょうか。”download(request)を実行するとファイルがダウンロードされるようにします”と書かれておりましたが、ここがイマイチピンときていません。

ご回答よろしくお願いします。

One Answer

下記サイト
https://pc.atsuhiro-me.net/entry/2014/09/28/140421

このサイトにて掲載されているテキストファイルをダウンロードする例を引用します。

def download(request):
    output = io.StringIO()
    output.write("First line.n")
    response = HttpResponse(output.getvalue(), content_type="text/plain")
    response["Content-Disposition"] = "filename=text.txt"
    return response

これが実現する機能は、サーバアプリケーション内部でファイルのようなレスポンスを作成し、ファイルとしてユーザーにダウンロードさせる (この例だとfile.txtというファイル名で「First line.」という内容のファイルを作成し、ダウンロードさせる)であり、Laurentechさんが求めているであろう サーバのローカルに存在するファイルをユーザーにダウンロードさせる ではありません。

英語版Stack Overflowに今回とほぼ同等の質問があり、これによると素直にファイルを直接開き、HttpResponse で返すのが良いようです。

https://stackoverflow.com/a/36394206/10216107

import os
from django.conf import settings
from django.http import HttpResponse

def download(request, path):
    file_path = os.path.join(settings.MEDIA_ROOT, path)
    if os.path.exists(file_path):
        with open(file_path, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel")
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
            return response
    raise Http404

Answered by PicoSushi on December 18, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP