我可以使用Mechanize表单成功地上传一个文件,如下所示:
def add_attachment(form, attachments)
attachments.each_with_index do |attachment, i|
form.file_uploads.first.file_name = attachment[:path]
end
end
,其中form
为机械化形式。但是,如果附件包含多个元素,则最后一个元素将覆盖前面的元素。这显然是因为我使用first
访问器,它总是返回file_uploads数组的相同元素。
为了解决这个问题,我尝试了这个,结果出现了一个错误,因为这个数组中只有一个元素。
def add_attachment(form, attachments)
attachments.each_with_index do |attachment, i|
form.file_uploads[i].file_name = attachment[:path]
end
end
如果我尝试创建一个新的file_upload对象,它也不工作:
def add_attachment(form, attachments)
attachments.each_with_index do |attachment, i|
form.file_uploads[i] ||= Mechanize::Form::FileUpload.new(form, attachment[:path])
form.file_uploads[i].file_name = attachment[:path]
end
end
你知道如何使用Mechanize上传多个文件吗?
所以,我解决了这个问题,但并不完全像我想象的那样。
我试图上传文件的网站是一个Redmine项目。Redmine使用JQueryUI作为文件上传器,这让我很困惑,因为Mechanize不使用javascript。但是,事实证明,如果Javascript被禁用,Redmine会很好地降级,我可以利用这一点。
当Javascript被禁用时,每次只能在编辑表单中上传一个文件,但是为刚刚创建的问题转到"edit"url可以上传第二个文件。我的解决方案是简单地附加一个文件,上传表单,然后单击结果页面上的"Update"链接,这将显示一个带有新表单和另一个上传字段的页面,然后我可以使用它来附加下一个文件。除了最后一个附件,我对所有附件都这样做了,这样表单处理就可以完成,然后最后一次上传。下面是相关的代码:
def add_attachment(agent,form, attachments)
attachments.each_with_index do |attachment, i|
form.file_uploads.first.file_name = attachment[:path]
if i < attachments.length - 1
submit_form(agent, form)
agent.page.links_with(text: 'Update').first.click
form = get_form(agent)
end
end
form
end
我使用了以下
form.file_uploads[0]。File_name = "要上传的第一个文件的路径"
form.file_uploads[1]。File_name = "要上传的第二个文件的路径"
form.file_uploads[2]。File_name ="第三个要上传文件的路径"。
并且工作正常。