Python Rest客户端api上传文件

时间:2018-10-24 18:41:26

标签: python rest api upload

我正在使用Python 2.7。我的Rest服务器端API可以正常工作,并且我可以使用Postman上传zip文件。我正在尝试使用Rest Client API上传zip文件。我尝试了请求包,但无法发送文件。我收到一个错误:缺少文件参数。

这是我的python服务器端代码:

@ns.route('/upload_file', strict_slashes=False)
class Upload(Resource):
    @api.expect(upload_parser)
    def post(self):

        args = upload_parser.parse_args()
        file_nameup = args.file.filename 

这是其余的api客户端代码:

import requests
from requests.auth import HTTPBasicAuth
import json

headers={'Username': 'abc@gmail.com', 'apikey':'123-e01b', 'Content-Type':'application/zip'}
f = open('C:/Users/ADMIN/Downloads/abc.zip', 'rb')

files = {"file": f}

resp = requests.post("https://.../analytics/upload_file", files=files, headers=headers )

print resp.text   

print "status code " + str(resp.status_code)

if resp.status_code == 200:
    print ("Success")
    print resp.json()
else:
    print ("Failure")

这是我的错误:     {“消息”:“输入有效负载验证失败”,“错误”:{“文件”:“需要缺少     上传文件中的参数”}     状态码400     失败

在邮递员中,我传递了一个zip文件,该文件的正文带有“ file”作为键,值作为abc.zip文件。工作正常。我尝试使用httplib库,但由于我的发布URL不包含端口号,因此它失败了。这是httplib的错误:

  

python HttpClientEx.py       追溯(最近一次通话):         文件“ HttpClientEx.py”,第4行,在           h = http.client.HTTPConnection(url)          init 中的文件“ c:\ python27 \ Lib \ httplib.py”,行736           (self.host,self.port)= self._get_hostport(主机,端口)         _get_hostport中的文件“ c:\ python27 \ Lib \ httplib.py”,行777           引发InvalidURL(“非数字端口:'%s'”%host [i + 1:])       httplib.InvalidURL:非数字端口:'// .... net / analytics / upload_file'

如何调用剩余url发布并使用urllib库上传文件。请建议其他任何方式在Rest Client中上传文件。谢谢。

我发现了另一个重复的帖子:

Python Requests - Post a zip file with multipart/form-data

此处提到的解决方案无效。我发现您需要提供文件的完整路径,否则它将无法正常工作。

2 个答案:

答案 0 :(得分:0)

使用urllib3模块。

https://urllib3.readthedocs.io/en/latest/user-guide.html

文件和二进制数据

要使用多部分/表单数据编码上传文件,可以使用与表单数据相同的方法,并将文件字段指定为(file_name,file_data)的元组:

with open('example.txt') as fp:
    file_data = fp.read()
r = http.request(
    'POST',
    'http://httpbin.org/post',
    fields={ 
        'filefield': ('example.txt', file_data),
    })

json.loads(r.data.decode('utf-8'))['files']

答案 1 :(得分:0)

请求库在我的代码中进行了以下更改:

import requests
from requests.auth import HTTPBasicAuth
import json
from pathlib import Path

file_ids = ''
headers={'Username': 'abc@gmail.com', 'apikey':'123-456'}
# Upload file

f = open('C:/Users/ADMIN/Downloads/abc.zip', 'rb')

files = {"file": ("C:/Users/ADMIN/Downloads/abc.zip", f)}

resp = requests.post("https:// ../analytics/upload_file", files=files, headers=headers )
print resp.text
print "status code " + str(resp.status_code)

if resp.status_code == 201:
    print ("Success")
    data = json.loads(resp.text)
    file_ids = data['file_ids']
    print file_ids
else:
    print ("Failure")