Ruby On Rails İle Sunucuya Dosya Gönderimleri
GiriÅ?
Ruby On Rails altyapısında sunucuya dosya gönderme iÅ?lemi birkaç aÅ?amada gerçekleÅ?tirilebilir. Yazının sonunda kullanıcılardan resim alan, aldıÄ?ı bu resmi ve ufak boyutlu görüntüsünü (thumbnail) kaydeden ufak bir yazılım geliÅ?tirmiÅ? olacaÄ?ız.
Kullanıcılardan dosya almak için “form”umuzu “multipart” olarak tanımlamalıyız. Bunun için form oluÅ?turma etiketimize “:multipart => true” argümanını yollamak yeterli olacaktır.
Ã?rneÄ?i geliÅ?tirmek için kullanıcıya formu gösteren ekle fonksiyonu, formun gideceÄ?i kayit fonksiyonu ve resimleri ototomatik boyutlandırıp ve gerekli kaydetmeyi gerçekleÅ?tiren “private” Å?eklinde “resim_ekle” fonksiyonu kullanacaÄ?ız. Bunları aynı denetleyici içerisinde oluÅ?turmayı unutmayın - aynı denetleyici dıÅ?ında yapmak isterseniz formun gideceÄ?i noktayı deÄ?iÅ?tirmeniz gerektiÄ?ini unutmayın -
Formumuzun Tanımlanması
Ã?rnekte kullanmak üzere kullanıcıdan yalnızca dosya giriÅ?i yapmasını isteyen bir form tanımlayacaÄ?ız.
Bu ekran denetleyicinin “ekle” fonksiyonunda gözükecektir. Bunun içinde denetleyicide “ekle” isimli fonksiyon oluÅ?turuyoruz.
def ekle
end
# ekle.rhtml adı altında app/views/denetleyici klasörüne kaydediyoruz.
< %= "<h2>#{flash[:notice]}" if flash[:notice] %>
< %= form_tag({:action=>'kayit'}, :multipart => true) %>
< %= file_field_tag 'resim' %>
< %= submit_tag 'Ekle' %>
< %= end_form_tag %>
Yukarıda belirtilen kodlarla kullanıcıya dosya giriÅ?i sunan form sayfası oluÅ?turduk. Form “kayit” sayfasına gidecektir. Kayıt sayfasında gelen bu dosyayı sunucumuza kayıt edeceÄ?iz.
Dosyayı kaydetmek için “private” olarak tanımlanan resim_ekle(dosya) iÅ?levini kullanacaÄ?ım. Bu iÅ?lev gerekli denetlemeleri yaparak sonucuna göre deÄ?er döndürüyor. (Ruby yahut sunucu kaynaklı hatada “0″, iÅ?lem baÅ?arılı ise “1″, dosya uzantısı kabul edilmemiÅ? ise “2″, dosya boyutu büyük ise “3″)
def kayit
d = @params['resim']
ekleme = resim_ekle(d)
if ekleme == 0
flash[:notice] = "dosya gönderilemiyor! bir hata oluÅ?tu"
elsif ekleme == 1
flash[:notice] = "iÅ?lem baÅ?arılı"
elsif ekleme == 2
flash[:notice] = "kabul edilen dosya uzantılar: png, jpg"
elsif ekleme == 3
flash[:notice] = "dosya boyutu çok büyük!"
end
redirect_to :action => 'ekle'
end
private
def resim_ekle(dosya)
# resmin kayıt edileceÄ?i klasör
klasor = "#{RAILS_ROOT}/public/images/emlaklar/"
# kabul edilen türler
dosya_turleri = ["image/png", "image/jpeg"]
# geçerli dosya türü olup olmadıÄ?ını kontrol edelim
unless dosya_turleri.include?(dosya.content_type.chomp)
2 # geçersiz dosya tipi
else
# boyutunu kontrol edelim
if dosya.size < 2000000
# öncelikle resmin kendisini kaydedelim
begin
isim = File.join(klasor, File.basename(dosya.original_filename))
File.open(isim, "wb") { |f| f.write(dosya.read) }
# ufak Å?eklini kayıt edelim
require 'RMagick'
include Magick
resim = ImageList.new(isim)
resim.thumbnail(100, 100)
resim.write(File.join(klasor, "k_", File.basename(dosya.original_filename)))
1 # iÅ?lem baÅ?arılı
rescue
0 # rubysel hata
end
else
3 # büyük boyutlu resim
end
end
end
Resmi nasıl kaydettik?
Gelen “TempFile” (öyle olduÄ?unu kabul ettik, aslında 10kb’den küçük boyutlu dosyaları denetleyerek onları direkt yeni dosya içine koymak gereklidir) dosyasının tamamını yeni oluÅ?turduÄ?umuz (File.open(.., wb)) dosyaya aktardık.
RMagick kütüphanesi kullanarak resmin küçük boyutlu halini kayıt ettik.
Sonuç
Formdan gelen dosyayı TempFile sınıflı nesne olarak iÅ?leyerek gerekli gönderme iÅ?lemlerini yapabiliriz.
Uyarılar
Dosya gönderirken kullanıcıların farklı iÅ?letim sistemleri kullanabilecekleri göz önüne alınmalıdır. Linux tabanlı bir sunucuya Windows üzerinden gönderilen dosyaların isimleri sorun çıkartabilir. Bunun için dosya isimlerinin kontrollü Å?ekilde iÅ?lenmesi gerekmektedir.







ailecek zevkle izliyoruz efem sitenizi :D
TeÅ?ekkür ediyorum, inÅ?allah yakın zamanda daha fazla yorumsal katılım olur diye umuyorum aynı zamanda :)