2017-04-11 78 views
1

我用下面的代码通过一个表格来上传单个文件:多文件上传与红宝石和西纳特拉

app.rb

@filename = params[:file][:filename] 
file = params[:file][:tempfile] 

File.open("./public/#{@filename}", 'wb') do |f| 
f.write(file.read) 
end 

string_file.erb:

<input type='file' class='form-control' id='<%= array['id'] %>'name='file[]' value='<%= default_value %>' <%= constraints %> style="display: none;" multiple> 

如何循环将多个文件写入文件系统?

+1

我会考虑上载的大小,服务器限制和应用响应...的例如,多个小型上传可能可以使用'XMLHttpRequest'和它的'progress'事件来指示上传状态,而你可能会考虑一个web袜子et解决方案来处理非常大的上传,允许上传在连接中断后恢复(无需重新启动上传)。另外,服务器的内存和CPU数量有限......当上传大文件时,某些Ruby服务器可能会导致DoS或资源匮乏,而其他服务器(例如'iodine')提供抢先上传大小限制。 – Myst

+0

@Myst感谢您的建议,我在客户端和服务器端添加代码以将文件限制为10 MB或更少,上传的文件也需要通过电子邮件发送。 –

+0

当然,不客气。祝你好运:-) ......作为最后一个注意事项,我认为到HTTP解析器完成并且Rack已经存储请求数据时,检查上传文件限制的问题可能有点晚。在服务器端,我会考虑使用代理层实现限制(即'nginx' /'apache'设置),或者通过使用支持的服务器设置 - [请参阅此处](http://stackoverflow.com/questions/2200188/Rails的文件上传大小限制)。 – Myst

回答

2

这是我的解决方案

puts params['images'].map{ |f| f[:filename] }.join(";") 
k = params['images'].map{ |f| f[:filename] }.join(";") 
$param = k.chomp.split(";") 
array_length = $param.length  # or $param.size 
array_lengthx = array_length - 1 
puts "length of $param is : #{array_length}" 

i = 0 
i = i - 1 
puts array_lengthx 
puts i 
while i.to_i < array_lengthx do 
    i =i+1 
    puts i 
    @filename = params[:images][i][:filename] 
    file = params[:images][i][:tempfile] 
    path = "/home/user/Descargas/sinatra_ajax-master/#{@filename}" 
    File.open("/home/user/Descargas/sinatra_ajax-master/#{@filename}", 'wb') do |f| 
    f.write file.read 
    end 
end 

这是HTML代码:

<form action="/upload2" method="post" enctype="multipart/form-data"> 
 
    <input type="file" name="images[]" multiple /> 
 
    <input type="submit" /> 
 
</form>