Django多文件上传

时间:2011-08-25 00:23:40

标签: 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()">

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

除了上传文件外,此表单已提交到我的视图并正确执行所有操作。

当我在视图中执行&#34; print request.FILES&#34;我明白了:

<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 个答案:

答案 0 :(得分:37)

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

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

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

另外,如果您想使用HTML5多文件上传而不是许多文件表单,请查看此处:django form with multiple file fields

答案 1 :(得分:3)

我之前没有做过这个问题,但似乎你需要在保存它之前对实际的音频文件进行一些处理。

一般结构如下:

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

答案 2 :(得分:0)

除了正确处理请求对象中的文件数组之外,还应该确保在html输入中有一个设置为true的“multiple”属性。 例如:

<input name="file_field" multiple="true" required="false" id="id_file_field" data-enpass.usermodified="yes" type="file">

相关问题