経緯
データアップロード処理記載後、txt形式は正常にダウンロードができたが、
Excelのみダウンロード後、開いた際に「ExcelでファイルXXX.xlsxを開くことができません。ファイル形式またはファイル拡張子が正しくありません。ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。」エラーが出る。
対応した内容を個人的備忘録として残しておく。
参考にさせて頂いたサイト
-
Djangoダウンロードについて
非常に参考になりました。ありがとうございます!
https://blog.narito.ninja/detail/93/ -
Markdown記法(投稿はじめてなので・・・)
https://qiita.com/tbpgr/items/989c6badefff69377da7
各ファイルの記載
models.py
from django.db import models
class UploadFile(models.Model):
file = models.FileField('ファイル')
def __str__(self):
return self.file.url
forms.py
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
fields = ('document', )
views.py
import mimetypes
import shutil
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.views import generic
from .models import UploadFile
def download(request, pk):
upload_file = get_object_or_404(Document, pk=pk)
file = upload_file.file # ファイル本体
name = file.name # ファイル名
# ファイル名からmimetypeを推測。拡張子がないファイル等は、application/octet-stream
response = HttpResponse(content_type=mimetypes.guess_type(name)[0] or 'application/octet-stream')
# Content-Dispositionでダウンロードの強制
response['Content-Disposition'] = f'attachment; filename={name}'
# HttpResponseに、ファイルの内容を書き込む
shutil.copyfileobj(file, response)
return response
html
<a href="{% url 'app:download' uploadfile.pk %}">{{ uploadfile }}
urls.py
urlpatterns = [
path('download/<int:pk>/', views.download, name='download'),
]
結果
無事ダウンロードできるようになりました。