Загрузка нескольких файлов Django
У меня есть форма, которая имеет следующий заголовок:
<form enctype="multipart/form-data" target="invisible" action="/calendar/createEvent/" method="POST">
и следующее тело:
<input class="multiFileInput" type="file" name="files" onchange="newInput();">
<input class="multiFileInput" type="file" name="files" onchange="newInput()">
<input class="multiFileInput" type="file" name="files" onchange="newInput()">
Наряду с множеством других входов, но загрузка файлов важна.
Эта форма отправляется на мой взгляд и делает все правильно, за исключением загрузки файла.
Когда я, в представлении, выполняю "print request.FILES", я получаю:
<MultiValueDict: {u'files': [<TemporaryUploadedFile: boson.mp3 (audio/mpeg)>, <TemporaryUploadedFile: hadron.mp3 (audio/mpeg)>]}>
Но когда я пытаюсь сделать больше с ними, он не позволит мне использовать их в качестве файлов.
Например, скажем, что у меня есть следующие таблицы:
class File(models.Model):
file = models.FileField(upload_to='files')
class Test(models.Model):
name = models.CharField(max_length=10)
files = models.ManyToManyField(File, related_name='files')
Если, на мой взгляд, я скажу:
for f in request.FILES['files']:
test = Test()
test.name='test'
test.save
empt = File()
empt.file = f
empt.save()
test.files.add(empt)
Я получаю следующее исключение:
DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte. You passed in '\xff\xfb\xe0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Info\x00\x00\x00\x0f\x00\x00\x98C\x02m~\t\x00\x03\x05\x08\n'
Кроме того, если я попытаюсь записать в пункт назначения, скажем, используя f.chunks(), я получаю
AttributeError: 'str' object has no attribute 'chunks'
Любая помощь будет принята с благодарностью. Я застрял на этом какое-то время и хотел бы помочь.
Ответы
Ответ 1
Вам следует получить доступ к многочастным значениям с помощью getlist, т.е.:
for afile in request.FILES.getlist('files'):
File(file=afile, files=test).save()
Я не думаю, что он получает список как список python, когда вы используете request.FILES['files']
.
Кроме того, если вы хотите использовать множественную загрузку HTML5 вместо многих форматов файлов, посмотрите здесь: форма django с несколькими полями файлов
Ответ 2
Я раньше этого не делал, но, похоже, вам нужно будет обработать фактический аудиофайл перед его сохранением.
Общая структура:
if form.is_valid():
object = form.save(commit=False)
t = handle_uploaded_file(request.FILES['file'])
object.field.save(t[0], t[1])
И в файле handle_uploaded_file вам, вероятно, нужно будет использовать что-то вроде ffmpeg для обработки звука, а затем return (filename, content)
для вашей основной функции.
Кроме того, использование .chunks
будет в переданном фактическом файле:
str=""
for c in request.FILES['file'].chunks():
str += c
Ответ 3
В дополнение к обработке массива файлов в объекте request правильно, как указано в других сообщениях, вы также должны убедиться, что в входе html у вас есть "множественный" -атрибут, для которого установлено значение true.
Пример:
<input name="file_field" multiple="true" required="false" id="id_file_field" data-enpass.usermodified="yes" type="file">