Как автоматически назначить тип содержимого при обслуживании файла в Django
У меня есть система, в которой для просмотра файлов требуются определенные разрешения, и я использую django-guardian
для разрешений. Я хочу, чтобы файл отображался в новой вкладке, если браузер поддерживает это, иначе просто загрузите файл.
Я могу проверить имя файла и вручную установить тип содержимого в зависимости от расширения файла, но их слишком много, и это кажется глупым занятием. Вот вид:
@login_required
def ViewDocument(request, document_id):
document = Document.objects.get(id=document_id)
path = document.file.name
# Check user permissions to view file
if not request.user.has_perm('home.view_document', document):
return HttpResponseForbidden("You don't have permission to access this media.")
# Construct the full path to the media file
media_path = os.path.join(settings.MEDIA_ROOT, path)
# can i do this more easily?
if path.endswith('.pdf'):
temp_content_type = "application/pdf"
elif path.endswith('.png'):
temp_content_type = "image/png"
elif path.endswith('.jpg'):
temp_content_type = "image/jpeg"
else:
temp_content_type = "application/octet-stream"
# Serve the file
with open(media_path, 'rb') as file:
response = HttpResponse(file.read(), content_type=temp_content_type)
return response
Используйте FileResponse
объекты Django для обслуживания файла. Все nitty-gritty будет обработано за вас под капотом.
return FileResponse(open(media_path, 'rb'))[1]
- Заголовок Content-Length автоматически устанавливается, если он может быть определен из содержимого
open_file
. - Заголовок Content-Type автоматически устанавливается, если он может быть угадан из
filename
или имениopen_file
.
Нет необходимости в многочисленных if
утверждениях, чтобы определить их.
[1] The file will be closed automatically, so don’t open it with a context manager. Give FileResponse
an open file.