1

我正在尝试通过 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 实际上是文件的路径,而我在读取内容之前正在执行 open(requestFile, 'rb') 。

我无法为我的生活弄清楚下一步该做什么。在过去的 10 个小时左右,我一直在谷歌上寻找答案。

4

2 回答 2

1

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

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

正确的行应该是:

'Content-Disposition: form-data; name="file"; filename="%s"' % smart_str(requestFile.name),
于 2012-05-30T08:43:34.437 回答
0

您正在尝试将数据解码为字符串,但在 join 函数上失败。如果 django 使用严格模式尝试解码数据,则会抛出错误。ignore模式只会跳过这些字节,这可以解释为什么它似乎可以从控制台工作)。

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

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

body = ["1", "\xff"]
result = 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)
于 2012-05-27T21:47:31.393 回答