无法将图像二进制文件添加到多部分/表单数据中

时间:2018-06-23 16:05:59

标签: python python-3.x multipartform-data

我收到一个错误:预期的str实例,当我尝试将图像二进制文件添加到multipart / form-data中时发现了字节。

问题是我试图将二进制格式的imageData追加到字符串中。有没有一种方法可以将二进制图像添加到多部分/表单数据中?

我不知所措,希望对此有所帮助。

store_true

跟踪:

imageData = request.FILES['filePath'].read()


content_type, request_body = encode_multipart_formdata([('include_target_data', targetMetaDataRet),
                                                     ('max_num_results', str(maxNoResultRet))],
                                                     [('image', imagePath, imageData)])

def encode_multipart_formdata(fields, files):

    BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
    CRLF = '\r\n'
    lines = []
    for (key, value) in fields:
        lines.append('--' + BOUNDARY)
        lines.append('Content-Disposition: form-data; name="%s"' % key)
        lines.append('')
        lines.append(value)
    for (key, filename, value) in files:
        lines.append('--' + BOUNDARY)
        lines.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename))
        lines.append('Content-Type: %s' % get_content_type(filename))
        lines.append('')
        lines.append(value)
    lines.append('--' + BOUNDARY + '--')
    lines.append('')
    body = CRLF.join(lines)
    content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
    return content_type, body

按照@coltoneakins请求,我已将请求正文修改为字节,但无论为什么,我似乎都收到了错误的请求错误?

代码:

  35.            response = get_response(request)

  128.           response = self.process_exception_by_middleware(e, request)

  126.           response = wrapped_callback(request, *callback_args, **callback_kwargs)

  166.           [('image', imagePath, imageData)])

  232.           body = CRLF.join(lines)

Exception Type: TypeError at /identify_shrine
Exception Value: sequence item 12: expected str instance, bytes found

1 个答案:

答案 0 :(得分:2)

您的代码中存在类型问题。您正在得到一个 TypeError预期的str实例,找到了字节,因为您尝试 join()一个包含 str 类型和“字节” 类型。

在代码中查看以下几行:

    for (key, filename, value) in files:
    lines.append('--' + BOUNDARY)
    lines.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename))
    lines.append('Content-Type: %s' % get_content_type(filename))
    lines.append('')
    lines.append(value) # <---------- THIS IS BYTES, EVERYTHING ELSE IS STR
lines.append('--' + BOUNDARY + '--')
lines.append('')
body = CRLF.join(lines) # <---------- AHHH RED FLAG!!!

CRLF str 。但是,(添加到您的列表中)为字节。这意味着您最终以包含 str bytes 类型。通过mulitpart / form-data请求发送图像时,请求的整个内容为字节。因此,您只需要将join()与 bytes 类型一起使用。

这就是你在做什么:

body = CRLF.join(lines)

这是真的:

'\r\n, i am a str'.join(['i am also str', b'I am not a str, I am bytes']) # <-- NO

这是您需要做的:

b'I am bytes'.join([b'I am also bytes', b'Me too!'])

此外,正如您所知,Requests库为您提供了发送文件的机制。请参阅files parameter in the Requests documentation或此StackOverflow答案:

https://stackoverflow.com/a/12385661/9347694

因此,您可能不需要在这里重新发明轮子。请求将对文件进行多部分编码,并为您构建请求。