解析多部分d的字符串

2024-05-20 10:26:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串(这里是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网关接收的数据。然而,{/cd2>要用一个方法来检索中包含的数据的方法是{/1>无法用这个方法来检索。有什么提示吗?在


Tags: 方法字符串nameformapi网关dataapplication
2条回答

如果使用的是API,最好使用json格式的数据。 您可以使用requests模块向API发送PUT请求,它将返回response对象,您可以使用响应.json()

Comment: is it robust and spec compliant?

只要您的数据符合以下前提条件:

  • 第一条线是边界
  • 以下标题以行结束
  • 每个消息部分以边界终止

Comment: What if the content is binary like a JPEG stream?

这很容易中断,因为使用了字符串方法,并且读取内容时使用.readline(),这取决于新行
因此,从BASE64到decode,然后unpack多部分是错误的方法!在


Comment: If there's a version reusing a common library

如果您能够将数据作为标准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))

Output:

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)

Question: Parse a string of multipart data

纯Python解决方案,例如:

^{pr2}$

Output:

{'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测试

相关问题 更多 >