Django Загрузка нескольких файлов - PullRequest
13 голосов
/ 25 августа 2011

У меня есть форма со следующим заголовком:

<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'

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

Ответы [ 3 ]

37 голосов
/ 09 сентября 2011

Вы должны получить доступ к многочастным значениям с помощью getlist, то есть:

for afile in request.FILES.getlist('files'):
    File(file=afile, files=test).save()

Я не думаю, что он получает список в виде списка Python, когда вы используете request.FILES['files'].

Также,если вы хотите использовать загрузку нескольких файлов HTML5 вместо множества форм файлов, посмотрите здесь: форма django с несколькими полями файлов

3 голосов
/ 25 августа 2011

Раньше я этого не делал, но, похоже, вам нужно выполнить некоторую обработку реального аудиофайла перед его сохранением.

Общая структура будет такой:

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
0 голосов
/ 18 января 2018

В дополнение к правильной обработке файлового массива в объекте запроса, как указано в других публикациях, вы также должны убедиться, что во входных данных html у вас есть «множественный» -атрибут, установленный в значение true. Пример:

<input name="file_field" multiple="true" required="false" id="id_file_field" data-enpass.usermodified="yes" type="file">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...