Кратко: файл, загружаемый через форму, необходимо обработать, чего ваша программа не делает.
Когда вы загружаете файл, Django сперва помещает его во временно хранилище. Маленькие файл размещаются в памяти, большие — в системной временной директории (на Linux это /tmp/
).
Пример (UploadFileForm — форма, содержащая поле file типа FileField):
def upload_file(request):
# Если метод POST
if request.method == 'POST':
# Заполняем форму полученными данными
form = UploadFileForm(request.POST, request.FILES)
# Если данные валидны
if form.is_valid():
# обрабатываем файл
handle_uploaded_file(request.FILES['file'])
# перенаправляем на другую страницу
return HttpResponseRedirect('/success/url/')
# Если другой метод (обычно GET)
else:
form = UploadFileForm()
# Выводим форму загрузки
return render_to_response('upload.html', {'form': form})
Перенаправление делают для того, чтобы при обновлении страницы файл не загружался повторно. handle_uploaded_file
— функция обработки файла, её нужно писать самому.
Пример копирования содержимого полученного файла в файл /srv/media/data.txt
:
def handle_uploaded_file(f):
with open('/srv/media/data.txt', 'wb+') as dest:
for chunk in f.chunks():
dest.write(chunk)
Нужно использовать chunks
, так как копирование по частям меньше нагружает систему. Просто копирование из временной папки тоже не подходит, так как файл может быть загружен в память.
Путь, по которому будет сохраняться файл можно сформировать самому из MEDIA_ROOT
и имени загруженного файла с помощью os.path.join
.
Обрабатывать файл можно по-разному. Можно прочитать его содержимое целиком при помощи метода read()
или по частям с помощью метода chunks()
и что-то с ним сделать. Но чаще всего файл просто сохраняют в какую-либо директорию, где он будет в дальнейшем хранится.
Также Django предоставляет удобный способ. Если файл также хранится в модели, то его можно сохранить в указанное место одним вызовом. Для этого в модели вы создаёте поле типа FileField
с аргументом upload_to
, содержащим путь, по которому будет размёщён файл. Если вы создавали форму на основе модели (то есть, с помощью ModelForm
), то достаточно команды
form.save()
для сохранения файла в указанное место. Также вы сможете загружать файлы через админку.
Загрузка файлов в Django