繁体   English   中英

解析一串多部分数据

[英]Parse a string of multipart data

我有一个字符串(这里解码为base64),如下所示:

----------------------------212550847697339237761929
Content-Disposition: form-data; name="preferred_name"; filename="file1.rtf"
Content-Type: application/rtf

{\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0

\f0\fs24 \cf0 testing123FILE1}
----------------------------212550847697339237761929
Content-Disposition: form-data; name="to_process"; filename="file2.rtf"
Content-Type: application/rtf

{\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0

\f0\fs24 \cf0 testing123FILE212341234}
----------------------------212550847697339237761929--

我在一个简单的网页上生成此内容,该网页通过API网关的PUT请求将几个文件上传到AWS Lambda脚本。 应该注意的是,我从API网关获得的是一个Base64字符串,然后我将其解码为上面的字符串。

上面的字符串是我的Lambda脚本从API网关接收的数据。 我想要做的是解析这个字符串,以便检索Python 2.7中包含的数据。 我已经尝试使用cgi类并使用cgi.parse_multipart()方法,但是,我找不到将字符串转换为必需参数的方法。 有小费吗?

评论 :它是否健壮且符合规范?

只要您的数据遵循此前提条件:

  • 第一行是边界
  • 以下标题以行终止
  • 每个消息部分都以边界终止

评论 :如果内容是像JPEG流一样的二进制文件怎么办?

由于使用了String Methodes并且读取内容使用的是.readline() ,这取决于New Line ,因此可能会中断。
因此从BASE64 decode然后unpack Multipart是错误的方法!


评论 :如果有一个版本重用公共库

如果您能够将数据作为标准MIME消息提供,则可以使用以下内容:

import email
msg = email.message_from_string(mimeHeader+data)
print('is_multipart:{}'.format(msg.is_multipart()))

for part in msg.walk():
    if part.get_content_maintype() == 'multipart':
        continue

    filename = part.get_filename()
    payload = part.get_payload(decode=True)
    print('{} filename:{}\n{}'.format(part.get_content_type(), filename, payload))

输出

 is_multipart:True application/rtf filename:file1.rtf b'{\\rtf1\\x07nsi\\x07nsicpg1252\\\\cocoartf1504\\\\cocoasubrtf830\\n{\\x0conttbl\\x0c0\\x0cswiss\\x0ccharset0'... (omitted for brevity) application/rtf filename:file2.rtf b'{\\rtf1\\x07nsi\\x07nsicpg1252\\\\cocoartf1504\\\\cocoasubrtf830\\n{\\x0conttbl\\x0c0\\x0cswiss\\x0ccharset0'... (omitted for brevity) 

问题 :解析一串多部分数据

纯Python解决方案,例如:

import re, io
with io.StringIO(data) as fh:
    parts = []
    part_line = []
    part_fname = None
    new_part = None
    robj = re.compile('.+filename=\"(.+)\"')

    while True:
        line = fh.readline()
        if not line: break

        if not new_part:
            new_part = line[:-1]

        if line.startswith(new_part):
            if part_line:
                parts.append({'filename':part_fname, 'content':''.join(part_line)})
                part_line = []

            while line and line != '\n':
                _match = robj.match(line)
                if _match: part_fname = _match.groups()[0]
                line = fh.readline()
        else:
            part_line.append(line)

for part in parts:
    print(part)

输出

 {'filename': 'file1.rtf', 'content': '{\\rtf1\\x07nsi\\x07nsicpg1252\\\\cocoartf1504\\\\cocoasubrtf830\\n... (omitted for brevity) {'filename': 'file2.rtf', 'content': '{\\rtf1\\x07nsi\\x07nsicpg1252\\\\cocoartf1504\\\\cocoasubrtf830\\n... (omitted for brevity) 

用Python测试:3.4.2

如果您正在使用API​​,最好使用json格式的数据。 您可以使用请求模块将PUT请求发送到API,它将返回响应对象,您可以使用方法response.json()从中轻松检索json数据

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM