Django转移上传的文件

时间:2012-05-27 15:12:47

标签: python django

我正在尝试通过django表单上传文件,然后将其发送到API。

这是编码功能:

#FYI, requestFile = request.FILES['file']
def EncodeFile(self, requestFile, fields = []):

    BOUNDARY    = '----------boundary------'
    CRLF        = '\r\n'
    body        = []
    # Add the metadata about the upload first

    for param in fields:
        body.extend(
          ['--' + BOUNDARY,
           'Content-Disposition: form-data; name="%s"' % param,
           '',
           fields[param],
           ])

    fileContent = requestFile.read()

    body.extend(
      ['--' + BOUNDARY,
       'Content-Disposition: form-data; name="file"; filename="%s"'
       % requestFile.name,
       # The upload server determines the mime-type, no need to set it.
       'Content-Type: ' + requestFile.content_type,
       '',
       fileContent,
       ])

    # Finalize the form body
    body.extend(['--' + BOUNDARY + '--', ''])
    result =  'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)
    return result

问题在于,当它到达“CRLF.join(body)”时,它抱怨“'utf8'编解码器无法解码位置0中的字节0xff:无效的起始字节”。

完全相同的代码片段在命令行中完美运行,但requestFile实际上是文件的路径,我在读取内容之前正在打开(requestFile,'rb')。

我不能为我的生活找出下一步该怎么做。我一直在谷歌上搜索过去10个小时左右的答案。

2 个答案:

答案 0 :(得分:1)

显然这行代码会导致问题:

'Content-Disposition: form-data; name="file"; filename="%s"' % requestFile.name,

正确的行将是:

'Content-Disposition: form-data; name="file"; filename="%s"' % smart_str(requestFile.name),

答案 1 :(得分:0)

您正在尝试将数据解码为字符串,并且在连接函数上失败。如果django使用严格模式尝试解码数据,则会引发错误。 ignore模式将跳过这些字节,这可能解释了为什么它似乎从控制台工作)。

因此您不希望将响应对象转换为unicode字符串。您应该尝试调试哪些函数尝试转换它并尝试阻止它。 join()函数不应该尝试将其转换为unicode。

要找到问题,您可以像这样简化它以帮助找到根本原因。这在python shell中适用于我(但它会在你的情况下导致相同的错误):

body = ["1", "\xff"]
result = 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)