如何使用restful上传包含数组的多个文件?

时间:2016-01-21 03:56:29

标签: python file-upload eve

我的架构:

test_multivalues = {
    'name': {'type':'string'},
    'multi': {'type': 'list', 'schema': {'type': 'media'}},
    'arr': {'type': 'list'},
}

我使用帖子数据如下:

内容类型:multipart / form-data

name: multivalue
multi: ....file1...
multi: ....file2....
arr: [arr_value1, arr_value2]

在Eve中,参数arr将作为列表获取,但multi仅获取第一个值。 我希望将multi作为[file1,file2]等列表。

当我阅读代码时,Eve在MultiDict.to_dict()方法中使用werkzeug的payload(),该方法仅返回同一个键的第一个值。 如何获取具有多个值的键作为列表?

更新 Eve将使用上面的架构和发布数据引发异常: multi:must be of list type

更新 是的,我用curl测试它。

curl -F "image=@text.txt" -F "image=@test.txt"  http://localhost/eve/api

当我将payload()中的代码更改为:

v = lambda l: l if len(l) > 1 else l[0]
return dict([(k, v(request.form.getlist(k))) for k in request.form] +
            [(k, v(request.files.getlist(k))) for k in request.files])

它返回文件列表,但是Eve的post方法不支持它,并抛出异常。

2 个答案:

答案 0 :(得分:0)

解决这个问题的丑陋方式:

def saver(filestorageobj):
    app.media.put(
                filestorageobj,
                filename=filestorageobj.name,
                content_type=filestorageobj.mimetype,
                resource='test')

def pre_test_POST_callback(request):
    from werkzeug.datastructures import ImmutableMultiDict

    # files format: [("pics", FileStorageObject)]
    pics = [saver(
        upfile[1]
        ) for upfile in request.files.items(True) if upfile[0] == "pics"]
    form = request.form.copy()
    form['pics'] = pics
    request.form = ImmutableMultiDict(form)
    request.files = ImmutableMultiDict()

答案 1 :(得分:0)

从0.7+版本的eve开始,你只需要将AUTO_COLLAPSE_MULTI_KEYS设置为True。