通过HTTP POST传递二进制文件

时间:2019-02-27 05:11:49

标签: python azure http python-requests azure-functions

我有一个本地python文件,可对二进制文件进行解码。这个python文件首先从文件中读取文件,将其打开为二进制文件,然后将其保存在缓冲区中并对其进行解释。读起来很简单:

with open(filepath, 'rb') as f:
    buff = f.read()
read_all(buff)

这在本地工作正常。现在,我想设置一个Azure Python作业,可以在其中发送文件。 100kb,通过HTTP POST,然后读取我的原始python脚本效果很好的解释后的元数据。

我首先删除了读取功能,以便现在仅使用缓冲区。 在我的Azure Python作业中,由HttpRequest触发

my_data = reader.read_file(req.get_body())

为了测试我的发送,我在python中尝试了以下内容

import requests

url = 'http://localhost:7071/api/HttpTrigger'
files = {'file': open('test', 'rb')}
with open('test', 'rb') as f:
        buff = f.read()

r = requests.post(url, files=files) #Try using files
r = requests.post(url, data=buff) #Try using data

我还在Postman中尝试过将文件作为二进制文件添加到主体并将标头设置为application / octet-stream

所有这些都不以与原始f.read()相同的方式发送二进制文件。因此,我对二进制文件的解释有误。

file.read的功能与我作为HTTP正文消息进行发送的方式不同吗?

从本地python读取文件中打印出第一行即可。

b'\n\n\xfe\xfe\x00\x00\x00\x00\\\x18,A\x18\x00\x00\x00(\x00\x00\x00\x1f\x00\x00\

在req.get_body()上打印出来显示给我

b'\n\n\xef\xbf\xbd\xef\xbf\xbd\x00\x00\x00\x00\\\x18,A\x18\x00\x00\x00(\x00\x00\x00\x1f\x00\

因此,显然有些错误。为什么这可能有所不同的任何帮助?

谢谢

编辑:

我在Flask中实现了类似的功能,并且效果很好。 flask中的代码只是从POST获取文件。没有编码/解码。

if request.method == 'POST':
      f = request.files['file']
      #f.save(secure_filename(f.filename))
      my_data = reader.read_file(f.read())

Azure功能为何与众不同?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用UTF-16解码并在代码中执行进一步的操作。

这是代码:

contents = contents.rstrip("\n").decode("utf-16")

基本上在完成re.get_body之后,执行以下操作:

.container

查看它是否为您提供与本地python文件中的接收结果相同的输出。

希望有帮助。