Команда разработчиков в процессе развития, неизбежно будет сталкиваться с некоторыми трудностями и проблемами, но они в конечном итоге найти способ преодолеть. Мы считаем, что этот опыт необходимо записать, так что есть [техническая] блог.
Джанго файлов, загруженных достичь
1. Общие сведения
В проекте VisualPytorch была необходимость обеспечить функцию загрузки файла. Сначала я думаю, что есть три вида программ
- Непосредственно на первой странице строки в файл, завершение клиента.
Информация о программе найдены через поиск-начало политики различных браузеров и политики безопасности не то же самое, трудно отказаться.
- На сервере, чтобы открыть серверную систему передачи файлов для предоставления услуг файлов.
Это идея начала, и не позже, что текущая производительность сервера сама ограничена на основе реального спроса, в сочетании с текущими потребностями в файл проект является относительно простой, никаких сложных файловых служб.
- Создание на сервере файлов непосредственно основной каталог, после передачи через пакет в виде HTTP потока
И в конечном счете, примененный метод, сравнительно просто и легко осуществить.
2, Джанго бэкенд файл упаковывается с загрузкой
О тюка файла, используйте пакет питона ZipFile при реализации этого
zipf = zipfile.ZipFile("project_VisualPytorch.zip", 'w',zipfile.ZIP_DEFLATED)
Для получения дополнительной информации об использовании ZipFile найти https://docs.python.org/3/library/zipfile.html
Фон сервер через объект ответа НТТР, выполненный с возможностью передавать данные на передний конец, для передачи больших файлов, рекомендуется использовать StreamingHttpResponse или конфигурацию кадра FileResponse Django объект ответ.
StreamingHttpResponse с использованием потоковых файлов, параметр итератора, передача фрагментации файлов, для достижения следующего
response = StreamingHttpResponse(file_iterator("project_VisualPytorch.zip"))
response['Content-Type'] = 'application/zip'
response['Content-Disposition'] = 'attachment;filename="project_VisualPytorch.zip"'
return response
Строительство итератора следующим образом
def file_iterator(file_name, chunk_size=512):
with open(file_name, 'rb') as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
При этом размер фрагмента 512 предусмотрен.
FileResponse подкласс StreamingHttpResponse с использованием методов кэширования, в некоторых случаях лучше, чем родительский класс.