

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

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

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


CC BY-SA 4.0
2018-11-03T12:53:26.080
49937
2022-03-13T07:06:15.570
2018-11-05T14:00:40.670
26890
26890
question
python api django
Djangoサーバー　ファイルのダウンロード


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

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

[code]

    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
    
[/code]

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

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

> <https://stackoverflow.com/a/36394206/10216107>
[code]

    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
    
[/code]


CC BY-SA 4.0
2018-11-06T07:32:16.547
50009
2018-11-06T07:32:16.547
29826
49937
answer