Ruby on Rails 2.1 - Dosya Yükleme
Site ziyaretçilerinizin sunucunuza bir dosya yüklemesini istediğiniz bir gereksiniminiz olabilir. Raylar, bu gereksinimi karşılamayı çok kolaylaştırır. Şimdi basit ve küçük bir Rails projesiyle ilerleyeceğiz.
Her zamanki gibi, adında yeni bir Rails uygulamasıyla başlayalım. upload. Basit rails komutunu kullanarak uygulamanın temel bir yapısını oluşturalım.
C:\ruby> rails -d mysql upload
Yüklenen dosyalarınızı nereye kaydetmek istediğinize karar verelim. Bunun olduğunu varsaydatagenel bölümünüzün içindeki dizin. Öyleyse, bu dizini oluşturun ve izinleri kontrol edin.
C:\ruby> cd upload
C:\ruby\upload> mkdir upload\public\data
Bir sonraki adımımız her zamanki gibi kontrolör ve modeller oluşturmak olacak.
Modeli Oluşturmak
Bu veritabanı tabanlı bir uygulama olmadığından, bizim için rahat olan her ismi tutabiliriz. Bir yaratmamız gerektiğini varsayalımDataFile model.
C:\ruby\upload> ruby script/generate model DataFile
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/data_file.rb
create test/unit/data_file_test.rb
create test/fixtures/data_files.yml
create db/migrate
create db/migrate/001_create_data_files.rb
Şimdi, adında bir yöntem oluşturacağız save içinde data_file.rbmodel dosyası. Bu yöntem, uygulama denetleyicisi tarafından çağrılacaktır.
class DataFile < ActiveRecord::Base
def self.save(upload)
name = upload['datafile'].original_filename
directory = "public/data"
# create the file path
path = File.join(directory, name)
# write the file
File.open(path, "wb") { |f| f.write(upload['datafile'].read) }
end
end
Yukarıdaki işlev CGI nesnesini alacaktır upload ve yüklenen dosya adını yardımcı işlevi kullanarak çıkaracaktır original_filenameve son olarak, yüklenen dosyayı "public / data" dizinine kaydedecektir. Yardımcı işlevi çağırabilirsinizcontent_type yüklenen dosyanın ortam türünü bilmek.
Buraya File bir yakut nesnesidir ve join dizin adını dosya adıyla birleştiren ve tam dosya yolunu döndüren yardımcı bir işlevdir.
Ardından, bir dosyayı yazma modunda açmak için, tarafından sağlanan açık yardımcı işlevini kullanıyoruz. Filenesne. Ayrıca, aktarılan veri dosyasından verileri okuyup çıktı dosyasına yazıyoruz.
Denetleyici Oluşturma
Şimdi, yükleme projemiz için bir denetleyici oluşturalım -
C:\ruby\upload> ruby script/generate controller Upload
exists app/controllers/
exists app/helpers/
create app/views/upload
exists test/functional/
create app/controllers/upload_controller.rb
create test/functional/upload_controller_test.rb
create app/helpers/upload_helper.rb
Şimdi iki denetleyici işlevi oluşturacağız. İlk işlevindex kullanıcı girdisini almak için bir görünüm dosyası ve ikinci işlevi çağırır uploadFilekullanıcıdan dosya bilgilerini alır ve bunu 'DataFile' modeline aktarır. Yükleme dizinini daha önce oluşturduğumuz 'uploads' dizinine ayarladık "directory = 'data'".
class UploadController < ApplicationController
def index
render :file => 'app\views\upload\uploadfile.html.erb'
end
def uploadFile
post = DataFile.save( params[:upload])
render :text => "File has been uploaded successfully"
end
end
Burada model dosyasında tanımlanan fonksiyonu çağırıyoruz. render işlevi, dosyayı görüntülemek ve bir mesaj görüntülemek için yeniden yönlendirmek için kullanılıyor.
Görünüm Oluşturuluyor
Son olarak, bir görünüm dosyası oluşturacağız uploadfile.rhtml,denetleyicide bahsettiğimiz. Bu dosyayı aşağıdaki kodla doldurun -
<h1>File Upload</h1>
<% form_tag ({:action => 'uploadFile'},
:multipart => true) do %>
<p><label for="upload_file">Select File</label> :
<%= file_field 'upload', 'datafile' %></p>
<%= submit_tag "Upload" %>
<% end %>
Burada her şey daha önceki bölümlerde anlattığımızla aynıdır. Tek yeni etiketfile_field, kullanıcının bilgisayarından bir dosya seçmek için bir düğme oluşturacaktır.
Multipart parametresini true olarak ayarlayarak, eyleminizin ikili verileri dosyadan düzgün bir şekilde geçirmesini sağlarsınız.
Burada dikkat edilmesi gereken önemli bir nokta, atadığımız "uploadFile" yöntem adı olarak :action, tıkladığınızda aranacak Upload buton.
Size aşağıdaki gibi bir ekran gösterecektir -
Şimdi bir dosya seçin ve yükleyin. Bu dosya, gerçek dosya adıyla app / public / data dizinine yüklenecek ve "Dosya başarıyla yüklendi" mesajı görüntülenecektir.
NOTE - Çıktı dizininizde aynı ada sahip bir dosya zaten varsa, üzerine yazılacaktır.
Internet Explorer'dan Yüklenen Dosyalar
Internet Explorer, gönderilen dosya adındaki bir dosyanın tüm yolunu içerir, bu nedenle original_filename rutin şöyle bir şey döndürür -
C:\Documents and Files\user_name\Pictures\My File.jpg
Bunun yerine -
My File.jpg
Bu kolaylıkla halledilir File.basename, dosya adından önceki her şeyi çıkarır.
def sanitize_filename(file_name)
# get only the filename, not the whole path (from IE)
just_filename = File.basename(file_name)
# replace all none alphanumeric, underscore or perioids
# with underscore
just_filename.sub(/[^\w\.\-]/,'_')
end
Mevcut bir Dosyayı Silme
Mevcut herhangi bir dosyayı silmek istiyorsanız, oldukça basittir. Tek yapmanız gereken şu kodu yazmaktır -
def cleanup
File.delete("#{RAILS_ROOT}/dirname/#{@filename}")
if File.exist?("#{RAILS_ROOT}/dirname/#{@filename}")
end
Hakkında eksiksiz bir ayrıntı için File nesne, bizim gözden geçirmeniz gerekiyor Ruby Reference Manual.