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

我通过文件输入上传多个图像,其中输入的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是否有一个通用的’catch all’类型的方法可以使用,如:

 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 

这似乎有点狡猾,因为我不太确定它是如何工作的,但它正在发挥作用。

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

启用此function的是使用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

Interesting Posts