LoginSignup
2
0

More than 1 year has passed since last update.

【備忘録】Django Excelダウンロード

Last updated at Posted at 2022-03-16

経緯

データアップロード処理記載後、txt形式は正常にダウンロードができたが、
Excelのみダウンロード後、開いた際に「ExcelでファイルXXX.xlsxを開くことができません。ファイル形式またはファイル拡張子が正しくありません。ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。」エラーが出る。

対応した内容を個人的備忘録として残しておく。

参考にさせて頂いたサイト

  1. Djangoダウンロードについて
    非常に参考になりました。ありがとうございます!
    https://blog.narito.ninja/detail/93/

  2. 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'),
]

結果

無事ダウンロードできるようになりました。

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0