我有一个具有以下标题的表单:
<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表单
我以前没有做过这件事,但似乎您需要在保存之前对实际音频文件进行一些处理。
一般结构是:
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)
| 归档时间: |
|
| 查看次数: |
25772 次 |
| 最近记录: |