我正在尝试通过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个小时左右的答案。
答案 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)