restful python上传文件到服务器

时间:2016-10-24 13:57:19

标签: python rest nginx python-requests

我有一个运行烧瓶的服务器,并且有一些api打开供客户端上传文件。

客户端在上传大文件时遇到问题(> 100MB)。

首先,我在客户端使用以下代码尝试了urllib2:

def uploadFile(url, params, user, token):
    try:
        from poster.encode import multipart_encode
        from poster.streaminghttp import register_openers
        import urllib2
        file_path = params["filepath"]
        register_openers()
        tempparams = {'file': open(file_path, "rb")}
        f = open(file_path,'rb')
        tempparams = {'file': open(file_path, "rb")}
        finalparams = dict(params, **tempparams)
        datagen, headers = multipart_encode(finalparams)
        request = urllib2.Request(url, datagen, headers)
        request.add_header("Authorization", "Basic %s" % base64string)
        result = urllib2.urlopen(request)
        resultData =  result.read()
        resultJson = json.loads(resultData)
        return resultJson
    except Exception as e:
        return {"error": e, "error_code": 503}

在服务器:

def upload_file_old():
    fileobj =request.files["file"]

    try:
        fileobj.save(webserver_filepath)
    except Exception as e:
        logger.info(e)
    .....
    return some_result, 201

但上述代码在客户端上传大文件时会导致以下错误,服务器根本没有记录日志。

urlopen error [errno 10054]

然后我尝试使用请求工具带发送文件,因为很多帖子在堆栈溢出时建议使用除使用urllib之外的请求。

在客户:

def uploadFile(url, params, user, token):
    try:
        import requests
        from requests_toolbelt import MultipartEncoder
        file_path = params["filepath"]
        m = MultipartEncoder(fields={
        'file':(params["name"],open(file_path,'rb'),"application/octet-stream" )
        }) 
        r = requests.post(url, data=m, headers={'Content-Type': m.content_type}, auth=(user, token))
        return r.json()
    except Exception as e:
        return {"error": e, "error_code": 503}

在服务器:

def upload_file_old():
    fileobj =request.files["file"]

    try:
        fileobj.save(webserver_filepath)
    except Exception as e:
        logger.info(e)
    .....
    return some_result, 201

同样,发送小文件工作正常,而上述代码的大文件失败,错误输出如下:

 ('Connection aborted.', error(104, 'Connection reset by peer'))

使用python在restful http请求中上传大文件的正确方法是什么?

0 个答案:

没有答案