2

我实际上正在尝试做一些我不知道是否可以的事情。

问题:

我有一个 Web 客户端和一个 Web 服务器,服务器(用 python 和烧瓶编写)处理一个 pdf 文件以获取一些数据,客户端只发送 pdf 文件并等待响应。认为客户端可以发送各种 pdf 文件进行处理,而我想要做的是,只需一个请求即可将所有 pdf 从客户端发送到服务器。

我计划做的事情:

我正在考虑将每个 pdf 的 Blob 转换为 String 并发送一个带有 JSON 正文的 POST 请求,如下所示:

BODY:
  {
    "content":[
        {"name": "pdf_name_1.pdf", "data": "some blob data converted to string"},
        {"name": "pdf_name_2.pdf", "data": "some blob data converted to string"},
        {"name": "pdf_name_3.pdf", "data": "some blob data converted to string"},
        ...
    ]
}

所以然后在服务器中,我想再次将数据转换为 blob(字节),以便写下 pdf 并开始处理数据。

我的问题:

有什么方法可以将 pdf 的 str 表示形式转换为字节,以便用 python 在磁盘上写下 pdf?

非常感谢,如果有人想出另一种想法,只在一个请求中发送一堆 pdf,请告诉我。

pd:我在 web 服务器上使用 python 3.5 和 Flask。

4

1 回答 1

1

在这种情况下,最好使用files关键字发送文件数据,如下所示:

import requests


def send_pdf_data(filename_list, encoded_pdf_data):
    files = {}

    for (filename, encoded, index) in zip(filename_list, encoded_pdf_data, range(len(filename_list))):
        files[f"pdf_name_[index].pdf"] = (filename, open(filename, 'rb'), 'application/pdf')

    data = {}
    # *Put whatever you want in data dict*

    requests.post("http://yourserveradders", data=data, files=files)


def main():
    filename_list = ["pdf_name_1.pdf", "pdf_name_2.pdf"]
    pdf_blob_data = [open(filename, 'wb').read() for filename
                     in filename_list]

if __name__ == '__main__':
    main()

但是,如果您真的想将数据作为 json 传递,您应该使用 @Mark Ransom 提到的 base-64 模块。

您可以通过以下方式实现它:

import requests
import json
import base64


def encode(data: bytes):
    """
    Return base-64 encoded value of binary data.
    """
    return base64.b64encode(data)


def decode(data: str):
    """
    Return decoded value of a base-64 encoded string.
    """
    return base64.b64decode(data.encode())


def get_pdf_data(filename):
    """
    Open pdf file in binary mode,
    return a string encoded in base-64.
    """
    with open(filename, 'rb') as file:
        return encode(file.read())


def send_pdf_data(filename_list, encoded_pdf_data):
    data = {}
    # *Put whatever you want in data dict*
    # Create content dict.
    content = [dict([("name", filename), ("data", pdf_data)])
               for (filename, data) in zip(filename_list, encoded_pdf_data)]
    data["content"] = content

    data = json.dumps(data) # Convert it to json.
    requests.post("http://yourserveradders", data=data)


def main():
    filename_list = ["pdf_name_1.pdf", "pdf_name_2.pdf"]
    pdf_blob_data = [get_pdf_data(filename) for filename
                     in filename_list]

if __name__ == '__main__':
    main()
于 2018-09-06T18:20:25.210 回答