首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >解析multipart/form-data,从请求post接收

解析multipart/form-data,从请求post接收
EN

Stack Overflow用户
提问于 2015-10-27 21:28:52
回答 3查看 27.1K关注 0票数 16

我正在使用请求库编写Web服务客户端。我正在获取multipart/form-data格式的数据,其中包含一个文件和text-json。我不知道如何解析它。有没有合适的库来解析python中的multipart/form-data格式,或者我应该自己编写解析器?

我的代码:

代码语言:javascript
复制
data = {
  "prototypeModel" :('prototypeModel', open(prototypeModel, 'rb'), 'application/octet-stream', {'Expires': '0'}),
  "mfcc_1" : ('mfcc', open(mfcc_1, 'rb'), 'application/octet-stream', {'Expires': '0'}),
  "mfcc_2" : ('mfcc', open(mfcc_2, 'rb'), 'application/octet-stream', {'Expires': '0'}),
  "mfcc_3" : ('mfcc', open(mfcc_3, 'rb'), 'application/octet-stream', {'Expires': '0'}),
}

print( '---------------------- start enroll ----------------------')
testEnrollResponse = requests.post(server+sessionID, files = data, json = declaredParameters)

b'\r\n--c00750d1-8ce4-4d29-8390-b50bf02a92cc\r\nContent-Disposition:表单数据;

“playbackHash”\r\n内容类型: application/octet-stream\r\n\r\n\x16\x00\x00\x00\x00\x00\x00\x00serialization::archive\n\x00\x04\x08\x04 ...x00\x00R\x94\x9bp\x8c\x00\r\n--c00750d1-8ce4-4d29-8390-b50bf02a92cc\r\nContent-Disposition:表单数据;Name=“usersMFCC”\r\n内容类型: application/octet-stream\r\n\r\n\x16\x00\x00\x00\x00\x00\x00\x00serialization::archive\n\x00\x04\x08\x04\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x16\x00\x00\x00\x00\x00\x00u\xbd\xb4/\xda1\xea\xbf\x0f\xed\xa2<\xc9\xf8\xe7\xbf?\xd5\xf06u\xe7\xf0\xbf\xd4\x8d\xd4\xa1F\xbe\x03@\x85X!\x19\xd8A\x06@\x8co\xf7\r .....

x80\xd9\x95Yxn\xd0?\r\n--c00750d1-8ce4-4d29-8390-b50bf02a92cc\r\nContent-Disposition: form-data;charset=utf-8\r\n\r\n{"lexLikelihood":1.544479046897232,“overallScore”\r\n内容类型:x80\xd9\x95Yxn\xd0?\r\n--c00750d1-8ce4-4d29-8390-b50bf02a92cc\r\nContent-Disposition:/json;charset=utf-8\r\n\r\n{“lexLikelihood”:1.544479046897232,"overallScore":-nan,"playbackLikelihood":-inf,"status":{"errorCode":0,json

我用“.....”替换了更多的二进制数据

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-27 22:01:24

如果您正在接收multipart/form-data响应,则可以使用requests-toolbelt库对其进行解析,如下所示:

代码语言:javascript
复制
$ pip install requests-toolbelt

安装后

代码语言:javascript
复制
from requests_toolbelt.multipart import decoder

testEnrollResponse = requests.post(...)
multipart_data = decoder.MultipartDecoder.from_response(testEnrollResponse)

for part in multipart_data.parts:
    print(part.content)  # Alternatively, part.text if you want unicode
    print(part.headers)
票数 22
EN

Stack Overflow用户

发布于 2017-07-04 02:49:33

Flask的代码示例,使用https://github.com/defnull/multipart

代码语言:javascript
复制
import multipart as mp
from multipart import tob

try:
    from io import BytesIO
except ImportError:
    from StringIO import StringIO as BytesIO

@app.route('/', methods=["GET","POST"])
def index():
        ...
        elif flask.request.method == "POST":
                data = flask.request.data
                s = data.split("\r")[0][2:]
                p = mp.MultipartParser(BytesIO(tob(data)),s)
                blob = p.parts()[0].value
                f = open("file.bin","wb")
                f.write(blob.encode("latin-1"))
                f.close()
票数 6
EN

Stack Overflow用户

发布于 2019-10-31 23:15:15

下面是解析多部分数据的working example。您可以在交互式python提示符下试用它。

代码语言:javascript
复制
import email

msg = email.message_from_string('''\
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="    XXXX"

--    XXXX
Content-Type: text/plain


--    XXXX
Content-Type: text/plain

--    XXXX--
''')

msg.is_multipart()

一旦你知道它在你的系统上工作,你就可以从POST数据中构建你自己的电子邮件消息,并以同样的方式解析它。如果您有一个字符串形式的原始post body,那么可以在请求头部中找到其余必要的信息。为了清楚起见,我在这里添加了缩进,在块字符串中不应该有无关的缩进。

代码语言:javascript
复制
    epost_data = '''\
MIME-Version: 1.0
Content-Type: %s

%s''' % (self.headers['content-type'], post_data)

    msg = email.message_from_string(post_data)

    if msg.is_multipart():
        for part in msg.get_payload():
            name = part.get_param('name', header='content-disposition')
            filename = part.get_param('filename', header='content-disposition')
            # print 'name %s' % name # "always" there
            # print 'filename %s' % filename # only there for files...
            payload = part.get_payload(decode=True)
            print payload[:100] # output first 100 characters

第一个%s将替换为内容类型,第二个将替换为post_data。然后,您可以将有效负载写入文件,等等。

要小心考虑保存文件的安全隐患。您可能无法信任张贴的文件名,例如在某些web服务器上,它可能以../../filename.sh开头,因此如果您尝试编写/my-folder/../../filename.sh,攻击者可能会将恶意文件放在您尝试存储文件的位置之外。还建议在信任文件本身之前,对文件进行严格的验证,使其成为允许的类型。您不想让攻击者覆盖您系统上的任何文件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33369306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档