le fichier de téléchargement sans activerecord
Comment gérez-vous upload de fichier dans le rail sans les attacher à l'enregistrement actif ?
Je veux juste écrire les fichiers sur le disque.
Merci,
Essayez cette easyrails.herokuapp.com/blogs/5/...
OriginalL'auteur Mike | 2009-11-04
Vous devez vous connecter pour publier un commentaire.
Si je comprends bien ce que vous avez besoin, alors le plus simple serait par exemple ceci:
Le contrôleur:
La vue:
Ce serait vous permettent de télécharger n'importe quel fichier, sans aucun contrôle ou de validations qui à mon avis n'est pas utile.
Si je voudrais le faire moi-même alors je voudrais utiliser quelque chose comme traitement pouvant être validé gem ou tableless gem juste tableless n'est pas supportée. Ces gemmes vous permettra de valider ce que vous avez téléchargées pour le rendre plus sain.
pour être cohérente, ne devriez-vous pas utiliser
File.join("public", "images", "upload")
pour créerdirectory
?Bien sûr, c'est une bonne astuce. A écrit ce vraiment il y a longtemps 🙂 Ne pense pas que je savais comment le faire à l'époque:) Juste utilisé des exemples lors du codage, donc en une ligne je l'utilise :)) Sur les autres je n'en ai pas. La mise à jour maintenant.
OriginalL'auteur Rytis Lukoševičius
Vous pouvez simplement déplacer le fichier temporaire au destin tracé à l'aide de FileUtils
OriginalL'auteur Felipe M Andrada
La
Tempfile
de la documentation montre un exemple qui est l'équivalent de Rytis du code, ce qui est bien la plupart du temps. Mais lorsque vous appeleztempfile.read
, le Rubis est la lecture de l'intégralité du fichier comme un seul morceau dans la mémoire, qui est sous-optimale.Cependant,
FileUtils
fournit uncopy_stream
méthode, etIO
, au moins en Ruby 2.0, fournit uncopy_stream
de mise en œuvre qui gère écrit directement à un chemin d'accès (FileUtils.copy_stream
nécessite Fichier des objets similaires sur les deux côtés, ou comme disent les docs).Dans mon cas, j'ai été de lancer un vaste multi-upload de fichier via AJAX, et je voulais éviter de lire tout le fichier(s) en Ruby en mémoire avant de les écrire sur le disque.
Dans l'exemple ci-dessous,
params[:files]
est unArray
deActionDispatch::Http::UploadedFile
cas, etlocal_filepath
est une chaîne pointant vers un fichier non-existant dans un répertoire existant. Par souci de concision, je vais considérer que je suis seulement le téléchargement d'un fichier:La
ActionDispatch::Http::UploadedFile
exemple, a une.tempfile
champ c'est juste unTempfile
instance.Je ne suis pas vraiment sûr que Ruby n'est pas encore la lecture de l'intégralité du fichier en mémoire—je n'ai pas de référence de rien—mais c'est beaucoup plus possible que c'est avec le
localfile.write(tempfile.read)
syntaxe.tl;dr:
IO.copy_stream(your_tempfile, your_disk_filepath)
est plus concis, plus rapide.OriginalL'auteur chbrown
Vous pouvez essayer d'utiliser le plugin Rails Attachment_fu gérer les uploads de fichier. Il vous permet d'enregistrer les téléchargements vers le système de fichiers au lieu de la base de données.
OriginalL'auteur kafuchau