2017-04-11 84 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>