- Konu sahibi
- #1
Rails uygulamasında resim yüklemek için Active Storage'ı kurup modele bir dosya ilişkisi ekleyin; formdan seçilen dosyayı denetleyiciye gönderin ve kayıt sayfasında
İlk komut Active Storage tabloları için migration dosyasını oluşturur; son komut hem bu tabloları hem de
Ardından
Üretimde seçtiğiniz Active Storage servisini ve kalıcı depolamayı ayrıca yapılandırın. Yerel diskin dağıtım veya yeniden başlatma sonrasında korunacağı varsayılmamalıdır. Özel resimler için de erişim yetkilendirmesini ayrıca tasarlayın; yalnızca resim bağlantısını gizlemek erişim kontrolü sağlamaz.
image_tag ile gösterin. Aşağıdaki örnek, her Photo kaydına tek resim bağlar ve geliştirme ortamında yerel disk kullanır.Active Storage ve modeli hazırlayın
Mevcut bir Rails uygulamasının kök dizininde aşağıdaki komutları çalıştırın. Örnek, uygulamada henüzPhoto modeli olmadığını varsayar:
Kod:
bin/rails active_storage:install
bin/rails generate model Photo title:string
bin/rails db:migrate
İlk komut Active Storage tabloları için migration dosyasını oluşturur; son komut hem bu tabloları hem de
photos tablosunu veritabanına uygular. Active Storage zaten kuruluysa ilk komutu yeniden çalıştırmayın. Model zaten varsa model oluşturma komutunu da atlayıp aşağıdaki ilişkiyi mevcut modele ekleyin.app/models/photo.rb dosyasını düzenleyin:
Ruby:
class Photo < ApplicationRecord
has_one_attached :image
end
has_one_attached, resim dosyasını kayıtla ilişkilendirir; photos tablosuna ayrıca bir resim sütunu eklemeniz gerekmez. Yerel deneme için config/environments/development.rb içinde Active Storage servisinin :local olduğundan ve config/storage.yml içinde bu servisin tanımlandığından emin olun.Formu ve kayıt işlemini oluşturun
config/routes.rb dosyasındaki mevcut Rails.application.routes.draw bloğunun içine şu satırı ekleyin:
Ruby:
resources :photos, only: [:new, :create, :show]
Ardından
app/controllers/photos_controller.rb dosyasını oluşturun:
Ruby:
class PhotosController < ApplicationController
def new
@photo = Photo.new
end
def create
@photo = Photo.new(photo_params)
if @photo.save
redirect_to @photo
else
render :new, status: :unprocessable_entity
end
end
def show
@photo = Photo.find(params[:id])
end
private
def photo_params
params.require(:photo).permit(:title, :image)
end
end
permit(:title, :image), formdaki başlığın ve dosyanın kayda atanmasına izin verir. Kaydetme başarısız olursa form yeniden gösterilir. Şimdi app/views/photos/new.html.erb dosyasını oluşturun:
HTML:
<% if @photo.errors.any? %>
<ul>
<% @photo.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
<% end %>
<%= form_with model: @photo, multipart: true do |form| %>
<div>
<%= form.label :title, "Başlık" %>
<%= form.text_field :title %>
</div>
<div>
<%= form.label :image, "Resim" %>
<%= form.file_field :image, accept: "image/jpeg,image/png" %>
</div>
<%= form.submit "Kaydet" %>
<% end %>
multipart: true formun dosyayı gönderebilmesini sağlar. accept ise dosya seçicisine JPEG ve PNG önerir; sunucu tarafında güvenlik doğrulaması değildir.Resmi gösterin ve yüklemeyi deneyin
app/views/photos/show.html.erb dosyasını oluşturun:
HTML:
<h1><%= @photo.title %></h1>
<% if @photo.image.attached? %>
<%= image_tag @photo.image, alt: @photo.title %>
<% else %>
<p>Bu kayda resim eklenmemiş.</p>
<% end %>
- Uygulamayı
bin/rails serverile başlatın ve tarayıcıdahttp://localhost:3000/photos/newadresini açın. - Bir başlık yazıp JPEG veya PNG dosyası seçin ve Kaydet'e basın. Başarılı kayıtta yeni kaydın sayfasına yönlendirilir ve resmi görürsünüz. Dosya seçmeden gönderirseniz bu örnek kaydı yine oluşturur, ancak resim yerine açıklama gösterir.
image olduğunu kontrol edin. Sunucu çıktısındaki hata, migration veya disk erişimi sorununu gösterebilir; yerel servis yapılandırmasını ve depolama dizinine yazma iznini de inceleyin. Sayfada resim görünmesi yalnızca o dosyanın o ortamda erişilebilir olduğunu gösterir; üretim ortamındaki depolamanın doğru yapılandırıldığını kanıtlamaz.Yayına almadan önce
Bu örnek temel yükleme akışını gösterir; herkese açık bir yükleme alanı için tek başına yeterli değildir. Sunucuda dosya boyutunu ve izin verilen türleri doğrulayın, içeriği güvenilir biçimde inceleyin ve yükleme yetkisini sınırlandırın. Yalnız dosya uzantısına, tarayıcı filtresine veya istemcinin bildirdiği içerik türüne güvenmeyin.Üretimde seçtiğiniz Active Storage servisini ve kalıcı depolamayı ayrıca yapılandırın. Yerel diskin dağıtım veya yeniden başlatma sonrasında korunacağı varsayılmamalıdır. Özel resimler için de erişim yetkilendirmesini ayrıca tasarlayın; yalnızca resim bağlantısını gizlemek erişim kontrolü sağlamaz.
Moderatör tarafında düzenlendi: