在Falcon REST中解码JSON文件上传

时间:2015-09-18 12:24:09

标签: rest python-3.x python-requests falconframework

我正在尝试解码在我的POST请求中上传的图片文件。

处理上传的我的类文件:

class Images(object):

    def on_post(self, req, resp):
        name = req.stream.read()
        helpers.write_json(resp, falcon.HTTP_200, {
            'name':str(name)
        })

调用API,并添加名称和图像文件。 图像名称“youtried.jpg”与我正在运行的文件“curl.py”处于同一级别。

url = 'http://localhost/service/images'
files = {
    'name': 'Jon Snow',
    'image': (open('youtried.jpg', 'rb').read())
}

r = requests.post(url, headers={'Content-type': 'multipart/form-data'},files=files)

print (json.loads(r.text))

我也尝试过更改

name = req.stream.read()

name = req.stream.read().decode('utf-8')

name = req.stream.read().decode('utf-16')

如果有正确的方法,请告诉我。

1 个答案:

答案 0 :(得分:4)

Falcon本身并不支持处理多部分/表单数据请求(包括文件上传),因此您必须使用第三方加载项,例如falcon-multipart

只需使用pip安装它,例如:

pip install falcon-multipart

并将其用作中间件,例如:

from falcon_multipart.middleware import MultipartMiddleware
app = falcon.API(middleware=[MultipartMiddleware()])

然后在Images类中,使用以下命令读取文件或文件名:

image = req.get_param('image')
# Read image as binary
raw = image.file.read()
# Retrieve filename
filename = image.filename

因此,在您的代码的上下文中,这是正确和完整的版本:

import falcon
import json

from falcon_multipart.middleware import MultipartMiddleware


class Images(object):

    def on_post(self, req, resp):
        image = req.get_param('image')
        # only if you need the image data
        # raw = image.file.read()
        filename = image.filename
        helpers.write_json(resp, falcon.HTTP_200, {
            'name': filename
        })


app = falcon.API(middleware=[MultipartMiddleware()])
app.add_route('/service/images', Images())