【问题标题】:Django Multiple File UploadDjango 多文件上传
【发布时间】:2023-03-31 21:43:01
【问题描述】:

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

<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() 写入目的地,我会得到 ​​p>

AttributeError: 'str' object has no attribute 'chunks'

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

【问题讨论】:

    标签: django


    【解决方案1】:

    您应该使用 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

    【讨论】:

      【解决方案2】:

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

      一般结构是:

      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
      

      【讨论】:

        【解决方案3】:

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

        &lt;input name="file_field" multiple="true" required="false" id="id_file_field" data-enpass.usermodified="yes" type="file"&gt;

        【讨论】:

        • 请考虑将此补充/通知作为评论放在其他帖子下。
        • 蒂姆,我不能对其他帖子发表评论。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 2015-08-08
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多