0

我有一个同时上传两个文件的请求。对象的 FILES 属性request如下所示:

<MultiValueDict: {u'output': [<InMemoryUploadedFile: output.txt (text/plain)>], u'history': [<InMemoryUploadedFile: .history.json (application/octet-stream)>]}>

我将两个文件都存储为变量:

output = request.FILES['output']
history = request.FILES['history']

然后,我将 Django 模型上的两个文件字段分配给这些文件以尝试保存它们,但只有分配给的文件字段被output正确保存,另一个应该包含历史内容的字段不包含任何内容。

尝试在调试器中解决此问题后,我发现我只能读取history一次的内容,然后history.read()返回一个空字符串:''. output可以读取任意多次,它仍然返回outputs的实际内容。

我尝试了一堆不同的hacky策略来保存内容history,包括使用创建新文件FileContentFile但似乎django正在无视我创建返回此内容的文件的任何尝试.read()

作为记录,history它包含大量采用有效 JSON 格式且大小约为 12k 的二进制数据。 file说它是:

ASCII text, with very long lines, with no line terminators

Django的处理方式有什么我遗漏的history吗?

编辑:这是我要保存的模型上的字段(尽管我相信问题是在保存之前发生的):

   history_file = models.FileField(
        upload_to=history_file_name,
        null=True,
        blank=True
    )
    output_file = models.FileField(
        upload_to=output_file_name,
        null=True,
        blank=True
    )

这是保存模型的代码:

    result.output_file = output
    challenge.history_file = history
    challenge.save()

此问题出现在基于 View 的 CBV 的 post 方法中。我没有更改 Django 1.6.5 附带的任何默认文件处理设置

4

1 回答 1

0

我仍然不确定为什么会这样,但我可以通过执行以下操作来解决这个问题:

history = files['history']
history_content = history.read()
from django.core.files.base import ContentFile
history_content_file = ContentFile(history_content)
challenge.history_file.save(NAME, history_content_file)

作为记录,history_content_file只能从一次读取。

希望这可以帮助其他人,如果我明白这里发生了什么,我会发布更多。

于 2014-08-27T19:15:54.427 回答