Ruby on Rails
Téléchargement de fichier
Recherche…
Téléchargement de fichier unique avec Carrierwave
Commencer à utiliser les téléchargements de fichiers dans Rails est assez simple, la première chose à faire est de choisir le plug-in pour gérer les téléchargements. Les plus courants sont Carrierwave et Paperclip . Les deux sont des fonctionnalités similaires et riches en documentation sur
Prenons un exemple avec une image téléchargée par avatar simple avec Carrierwave
Après avoir bundle install
Carrierwave, tapez console
$ rails generate uploader ProfileUploader
Cela va créer un fichier de configuration situé dans /app/uploaders/profile_uploader.rb
Ici, vous pouvez configurer le stockage (local ou cloud), appliquer des extensions pour les manipulations d'images (c.-à-d. Générer des vignettes via MiniMagick) et définir la liste blanche des extensions côté serveur.
Ensuite, créez une nouvelle migration avec string tipe pour user_pic et montez-la dans le modèle user.rb.
mount_uploader :user_pic, ProfileUploader
Ensuite, affichez un formulaire pour télécharger l'avatar (peut être une vue d'édition pour l'utilisateur)
<% form_for @user, html: { multipart: true } do |f| %>
<%= f.file_field :user_pic, accept: 'image/png, image/jpg' %>
<%= f.submit "update profile pic", class: "btn" %>
<% end %>
Assurez-vous d'inclure {multipart: true} dans le formulaire de commande peut traiter les téléchargements. Accept est une option pour définir la liste blanche des extensions côté client.
Pour afficher un avatar, faites simplement
<%= image_tag @user.user_pic.url %>
Modèle imbriqué - téléchargements multiples
Si vous souhaitez créer plusieurs téléchargements, la première chose à faire est de créer un nouveau modèle et de définir des relations.
Supposons que vous souhaitiez plusieurs images pour le modèle de produit. Créer un nouveau modèle et le faire belongs_to
modèle parent
rails g model ProductPhoto
#product.rb
has_many :product_photos, dependent: :destroy
accepts_nested_attributes_for :product_photos
#product_photo.rb
belongs_to :product
mount_uploader :image_url, ProductPhotoUploader # make sure to include uploader (Carrierwave example)
accept_nested_attributes_for est indispensable, car il nous permet de créer un formulaire imbriqué, afin que nous puissions télécharger un nouveau fichier, modifier le nom du produit et définir le prix à partir d'un seul formulaire
Ensuite, créez un formulaire dans une vue (edit / create)
<%= form_for @product, html: { multipart: true } do |product|%>
<%= product.text_field :price # just normal type of field %>
<%= product.fields_for :product_photos do |photo| # nested fields %>
<%= photo.file_field :image, :multiple => true, name: "product_photos[image_url][]" %>
<% end %>
<%= p.submit "Update", class: "btn" %>
<% end %>
Le contrôleur n'a rien de spécial, si vous ne voulez pas en créer un nouveau, créez-en un nouveau dans votre contrôleur de produit.
# create an action
def upload_file
printer = Product.find_by_id(params[:id])
@product_photo = printer.prodcut_photos.create(photo_params)
end
# strong params
private
def photo_params
params.require(:product_photos).permit(:image)
end
Afficher toutes les images dans une vue
<% @product.product_photos.each do |i| %>
<%= image_tag i.image.url, class: 'img-rounded' %>
<% end %>