django で自分で作ったファイルをダウンロードさせる
どういうときの話?
例えばユーザーの入力によって動的にファイルを作り、そのファイルをModelのデータベースに保存1させつつ、ユーザーにダウンロードさせたいとき
下準備
# @settings.py MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') MEDIA_URL = '/media/'
参考
設定 | Django documentation | Django
Djangoで、ファイルダウンロード | NARITO BLOG
スラッシュの過不足があったりするとエラーが出るので注意。
# @urls.py from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # ... the rest of your URLconf goes here ... ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
これはユーザーだけじゃなくて、自分でアップロードする場合にも必要。これは開発時の設定なので注意
参考
静的ファイル (画像、JavaScript、CSS など) を管理する | Django documentation | Django
# @models.py from django.db import models class FileModel(models.Model): file = models.FileField(upload_to='files/')
足りない所は想像力で補ってください。
ファイルをModelに保存する
from django.core.files.base import ContentFile from .models import FileModel string = 'this is sample file content' myfile = FileModel() content = ContentFile(string) myfile.file.save('file_name', content)
参考
モデルフィールドリファレンス | Django documentation | Django
こうするとDBに登録されるのでフィルターとかソートとかして取り出せる(はず)。
同名のファイル名で上書きすると、suffixが付いたファイルが新たに作成されて、そちらがDBの指すファイルの実体となる。もとのファイルが削除されるわけではない。
html側は、
<a href="{{ uploadfile.file.url }}" download="{{ uploadfile.file.name }}">{{ uploadfile }}</a>
のようにdwonload属性を使うのが手軽でいいと思う。
参考
Djangoで、ファイルダウンロード | NARITO BLOG
-
この言い方は正しくないが↩