diff --git a/src/pretix/base/views/cachedfiles.py b/src/pretix/base/views/cachedfiles.py index 3d39ffdf7..61b586185 100644 --- a/src/pretix/base/views/cachedfiles.py +++ b/src/pretix/base/views/cachedfiles.py @@ -1,9 +1,10 @@ -from django.http import FileResponse, Http404, HttpRequest, HttpResponse +from django.http import Http404, HttpRequest, HttpResponse from django.shortcuts import get_object_or_404 from django.utils.functional import cached_property from django.views.generic import TemplateView from pretix.base.models import CachedFile +from pretix.helpers.http import ChunkBasedFileResponse class DownloadView(TemplateView): @@ -20,7 +21,7 @@ class DownloadView(TemplateView): if 'ajax' in request.GET: return HttpResponse('1' if self.object.file else '0') elif self.object.file: - resp = FileResponse(self.object.file.file, content_type=self.object.type) + resp = ChunkBasedFileResponse(self.object.file.file, content_type=self.object.type) resp['Content-Disposition'] = 'attachment; filename="{}"'.format(self.object.filename) return resp else: diff --git a/src/pretix/helpers/http.py b/src/pretix/helpers/http.py new file mode 100644 index 000000000..fd32d8bd4 --- /dev/null +++ b/src/pretix/helpers/http.py @@ -0,0 +1,9 @@ +from django.http import StreamingHttpResponse + + +class ChunkBasedFileResponse(StreamingHttpResponse): + block_size = 4096 + + def __init__(self, streaming_content=(), *args, **kwargs): + streaming_content = streaming_content.chunks(self.block_size) + super().__init__(streaming_content, *args, **kwargs)