我有一个包含以下标题的表单:
<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'
非常感谢任何形式的帮助。我已经坚持了一段时间并且会喜欢一些帮助
答案 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">