我有一个非常标准的Rails表单:
<div>
<h1>Create a New Listing</h1>
<%- form_for @listing, :html => {:multipart => true} do |f| -%>
<div><%= f.label :title, "Title:"%> <%= f.text_field :title %></div>
<div>
<%= f.label :image, "Image:" %> <%= f.file_field :image
</div>
<div>
<%= f.label :sound, "Sound Clip:"%> <%= f.file_field :sound %><br />
</div>
<div class="submit"><%= f.submit 'Post Listing' %></div>
<%- end -%>
</div>
当用户选择文件但表单因验证失败时,他必须始终重新选择该文件。它不粘。关于如何解决这个问题的任何建议?
谢谢!
答案 0 :(得分:6)
我认为你不能使文件字段变粘。即使Rails提供初始值,大多数浏览器也会忽略它(否则,一些smart-aleck可能会将默认文件设置为/etc/passwd
,如果你不注意,接下来你知道你的盒子是生根。
我能想到的最好的办法就是设置一个标志,说明文件已经上传,所以如果用户没有选择另一个,请使用上次请求中已经发送的文件。
更新:您会惊讶地发现有多少人没有任何安全技能。我认识人们使用浏览器root
。然而,“为什么”并不是一个问题 - 我试图做的重点只是它不是Rails的错,问题很可能在于浏览器的行为。
你可以阅读an article说得比我更好......
更新2:“您的框已植根”应该说“用户的框已植根”。我描述的场景是:用户提交文件innocent.txt
和CAPTCHA。恶意服务器响应CAPTCHA错误,再次输入,隐蔽地将文件从innocent.txt
更改为~/.ssh/id_rsa
。用户不查看文件字段(他已经在那里输入了正确的值),所以只需重做CAPTCHA并推送提交。现在,服务器具有用户的私有SSH密钥。