Подтвердить что ты не робот

Загрузка нескольких файлов 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'

Любая помощь будет принята с благодарностью. Я застрял на этом какое-то время и хотел бы помочь.

4b9b3361

Ответ 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">