如何处理多个文件上传,其中输入的名称和数量是动态的?

时间:2014-02-21 07:27:15

标签: jquery python-2.7 bottle form-data

我通过文件输入上传多个图像,其中name和输入数量是动态的。

他们确实遵循这个命名惯例:

<input name = "image_path" ...
<input name = "image_path_F1" ...
<input name = "image_path_F2" ...
<input name = "image_path_F3" ...

输入以FormData个对象的形式发送。

从我之前使用的Python脚本处理单个图像时:

uploaded_image = request.files.name_of_file_input_here

问题

是否有request.files可用的通用“全部捕获”方法,可以像以下一样使用:

uploaded_images = request.files.*all

或者我是否需要创建某种循环来处理可能的文件名,例如:

客户端(jQuery)

var names_array = ["image_path","image_path_F1","image_path_F2"];
var length_of_names_array = 3;

发送到Python ......

的Python

names_array = request.forms.names_array
length_of_names_array = request.forms.length_of_names_array

counter = 1
for i, val in enumerate(range(length_of_names_array)):
    if i == 0:
        constructor = "image_path"
        request.files.constructor
    else:
        constructor = "image_path_F" + str(counter)
        request.files.constructor
        counter += 1

上面的代码只会生成正确的名称(实际上我不确定上面的request.files方法是否适用于constructor - 编辑,它没有'似乎)。

这里的方法可能有一个解决方案:

https://stackoverflow.com/a/3111795/1063287

但我不太明白它是如何运作的,或者它究竟如何应用于上述情况:

  

如果您不知道密钥,可以迭代文件:

for filename, file in request.FILES.iteritems():
    name = request.FILES[filename].name

1 个答案:

答案 0 :(得分:0)

这看起来有点狡猾,因为我不太确定它是如何工作的,但它确实有效。

这是一个Mongo实现,但是我在这里添加它是因为我认为外卖是可以定义和访问多个文件输入,其中name是动态实体,因为输入数量。

启用此功能的是iteritems()

Python

for key, value in request.files.iteritems():
    uploaded_image = request.files[key]
    name, ext = os.path.splitext(uploaded_image.filename)
    if ext not in ('.png','.jpg','.jpeg','.JPG','.gif'):
        return "File extension not allowed."
    if uploaded_image and uploaded_image.file:
        raw = uploaded_image.file.read()
        filename = uploaded_image.filename
        dbname = 'grid_files'
        db = connection[dbname]
        fs = gridfs.GridFS(db)
        fs.put(raw,filename=filename, user_email = user_email)

这会将每个图像添加到数据库中,并使用文件名和用户电子邮件进行唯一标识(以及MongoDB自动生成的时间和长度字段)。

在客户端,输入附加到FormData对象:

<强>的jQuery

var image_inputs = $("#my_form input[type=file]");
$.each(image_inputs,function(obj,v) { 
var file = v.files[0];
var filename = $(v).attr("data-img_filename");
var name = $(v).attr("id");
myFormData.append(name, file, filename);
});

似乎文件名自动包含在内,无需像上面那样定义:

https://stackoverflow.com/a/21942376/1063287