【问题标题】:How to handle multiple file uploads where the name and number of inputs is dynamic?如何处理名称和输入数量是动态的多个文件上传?
【发布时间】:2014-02-22 02:39:16
【问题描述】:

我正在通过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 - edit,它似乎没有) .

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

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

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

如果你不知道密钥,你可以遍历文件:

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

【问题讨论】:

  • 您可以控制表单输入的命名吗?我认为这将是一个更简单的解决方案。
  • 它们是按照上面显示的约定动态命名的,因为输入的数量是动态的。必须有一种方法来做到这一点,我只是花了一些时间来弄清楚如何 - 即如何获取 Python 脚本中定义的每个输入,以便我可以将每个文件放入数据库中。
  • 您是否控制这些输入的动态命名方案?

标签: jquery python-2.7 bottle form-data


【解决方案1】:

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

这是一个 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

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 2018-02-08
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2021-03-20
    • 2021-07-27
    相关资源
    最近更新 更多