it-swarm.com.de

Eine Datei in Rails hochladen

Ich bin neu bei Rails und schreibe eine RESTful-Website mit der CRUD-Technik. Bisher habe ich drei Seiten erstellt, auf denen der Benutzer eine Zeile aus der Datenbank erstellen, bearbeiten und löschen kann. Auf meiner vierten Seite muss jedoch ein Formular zum Hochladen von Dateien enthalten sein, aber a) Ich weiß nicht, wie das Dateisystem mit Rails funktioniert, daher weiß ich nicht, wo Dateien gespeichert werden sollen. Die Datei wäre etwa 100 KB groß und konnte nicht im temporären Speicher abgelegt werden, da sie ständig heruntergeladen wird. Und b) Ich weiß nicht, wie ich in eine Datei schreiben soll.

Es wäre großartig, wenn Sie mir sagen könnten, wie ich das tun soll, was ich oben erwähnt habe. Erstellen Sie eine Upload-Eingabe in einem Eingabeformular und schreiben Sie die Datei anschließend in einen Dateipfad in einem separaten Verzeichnis.

64
max_

Update 2018

Während alles, was unten geschrieben steht, immer noch zutrifft, enthält Rails 5.2 jetzt active_storage, was das direkte Hochladen in S3 (oder andere Cloud-Speicherdienste), Bildtransformationen usw. ermöglicht. Sie sollten den Rails-Leitfaden ausprobieren und selbst entscheiden was zu deinen Bedürfnissen passt.


Während es viele Edelsteine ​​gibt, die das Hochladen von Dateien sehr gut lösen (siehe https://www.Ruby-toolbox.com/categories/Rails_file_uploads für eine Liste), hat Rails integrierte Helfer, die das Rollen erleichtern Ihre eigene Lösung.

Verwenden Sie den Formular-Helfer file_field in Ihrem Formular. Rails übernimmt das Hochladen für Sie:

<%= form_for @person do |f| %>
  <%= f.file_field :picture %>
<% end %>

Sie haben im Controller Zugriff auf die hochgeladene Datei wie folgt:

uploaded_io = params[:person][:picture]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
  file.write(uploaded_io.read)
end

Dies hängt von der Komplexität des gewünschten Ziels ab. Dies reicht jedoch aus, um das Hochladen und Herunterladen von Dateien zu erleichtern. Dieses Beispiel stammt aus den Rails-Handbüchern. Dort finden Sie weitere Informationen: http://guides.rubyonrails.org/form_helpers.html#uploading-files

112
fabi

Für das Hochladen von Dateien gibt es ein schönes Juwel: carrierwave . Wenn das Wiki nicht hilft, gibt es eine Nice RailsCast - über den besten Weg, es zu benutzen. Zusammenfassend gibt es in Rails-Formularen einen Feldtyp file, der den Datei-Upload-Dialog aufruft. Sie können es verwenden, aber die 'Magie' wird von carrierwave gem ausgeführt. 

Ich weiß nicht, was Sie mit "Schreiben in eine Datei" meinen, aber ich hoffe, das ist ein schöner Anfang. 

3
R Milushev

September 2018

Für alle, die diese Frage in letzter Zeit überprüft haben, verfügt Rails 5.2+ jetzt standardmäßig über ActiveStorage.

Da es jetzt Teil des Kerns Rails 5.2+ ist, ist es sehr gut integriert und verfügt über hervorragende Fähigkeiten (alle anderen bekannten Edelsteine ​​wie Carrierwave, Shrine, Paperclip, ...) sind großartig gute Eigenschaften, die wir für jedes neue Rails-Projekt berücksichtigen können)

Das Paperclip-Team lehnte den Edelstein zugunsten des Rails ActiveStorage ab.

Hier ist die Github-Seite für ActiveStorage . Es stehen überall Ressourcen zur Verfügung

Ich fand dieses Video auch sehr hilfreich, um die Funktionen von Activestorage zu verstehen

1
Ahmed Elkoussy

Okay. Wenn Sie die Datei nicht in einer Datenbank speichern und in der Anwendung speichern möchten (z. B. Assets (benutzerdefinierter Ordner)), können Sie eine von attr_accessor: document definierte Nicht-DB-Instanzvariable definieren und die Datei mit form_for - f.file_field abrufen.

In der Steuerung

 @person = Person.new(person_params)

Hier person_params gibt Whitelist params[:person] zurück (definieren Sie sich selbst)

Datei speichern als,

dir = "#{Rails.root}/app/assets/custom_path"
FileUtils.mkdir(dir) unless File.directory? dir
document = @person.document.document_file_name # check document uploaded params
File.copy_stream(@font.document, "#{dir}/#{document}")

Hinweis: Fügen Sie diesen Pfad in .gitignore hinzu. Wenn Sie diese Datei erneut verwenden möchten, fügen Sie diesen Pfad asset_pathan der Anwendung von application.rb hinzu.

Wann immer das Formularfeld gelesen wird, wird es im tmp-Ordner gespeichert. Später können Sie es an Ihrem Platz speichern

note : Wenn Sie Dateien wie diese speichern, wird die Größe der Anwendung vergrößert, besser in der Datenbank mit Paperclip gespeichert zu werden.

0
ray

In Ihrer intiallizer/carrierwave.rb

if Rails.env.development? || Rails.env.test?
    config.storage = :file
    config.root = "#{Rails.root}/public"
    if Rails.env.test?
      CarrierWave.configure do |config|
        config.storage = :file
        config.enable_processing = false
      end
    end
 end

verwenden Sie diese Option, um in einer Datei zu speichern, während Sie lokal ausgeführt werden

0
Saif chaudhry