Django多文件上传

aai*_*zis 14 django

我有一个具有以下标题的表单:

<form enctype="multipart/form-data" target="invisible" action="/calendar/createEvent/" method="POST">
Run Code Online (Sandbox Code Playgroud)

和以下机构:

<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()">
Run Code Online (Sandbox Code Playgroud)

除了很多其他输入外,文件上传也很重要.

此表单将提交到我的视图并正确执行所有操作,但文件上载除外.

当我在视图中执行"print request.FILES"时,我得到:

<MultiValueDict: {u'files': [<TemporaryUploadedFile: boson.mp3 (audio/mpeg)>, <TemporaryUploadedFile: hadron.mp3 (audio/mpeg)>]}>
Run Code Online (Sandbox Code Playgroud)

但是当我尝试用它们做更多时,它不会让我把它们用作文件.

例如,假设我有以下表格:

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')
Run Code Online (Sandbox Code Playgroud)

如果在我看来我说:

for f in request.FILES['files']:

    test = Test()
    test.name='test'
    test.save

    empt = File()
    empt.file = f
    empt.save()

    test.files.add(empt)
Run Code Online (Sandbox Code Playgroud)

我得到以下例外:

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'
Run Code Online (Sandbox Code Playgroud)

此外,如果我尝试写一个目的地说使用f.chunks(),我得到

AttributeError: 'str' object has no attribute 'chunks'
Run Code Online (Sandbox Code Playgroud)

任何形式的帮助将不胜感激.我已经坚持了一段时间,并希望得到一些帮助

Edd*_*Edd 37

您应该使用getlist访问多部分值,即:

for afile in request.FILES.getlist('files'):
    File(file=afile, files=test).save()
Run Code Online (Sandbox Code Playgroud)

我不认为它在你使用时将列表作为python列表request.FILES['files'].

此外,如果您想使用HTML5多文件上传而不是许多文件表单,请看一下:带有多个文件字段的django表单


Dav*_*542 3

我以前没有做过这件事,但似乎您需要在保存之前对实际音频文件进行一些处理。

一般结构是:

if form.is_valid():
    object = form.save(commit=False)
    t = handle_uploaded_file(request.FILES['file'])
    object.field.save(t[0], t[1])
Run Code Online (Sandbox Code Playgroud)

在handle_uploaded_file中,您可能需要使用诸如ffmpeg之类的东西来处理音频,然后再return (filename, content)处理您的主函数。

此外,使用.chunks将是在传递的实际文件上:

str=""
for c in request.FILES['file'].chunks(): 
   str += c
Run Code Online (Sandbox Code Playgroud)