Impossible de lire le fichier avec la fonction send_file dans Rails 3
-
28-10-2019 - |
Question
Le code J'utilise:
Dans le fichier de vue:
<%= link_to "Download", download_image_path(image) %>
Dans le contrôleur:
def download
@image = Image.find(params[:id])
send_file "#{RAILS_ROOT}/public" + @image.attachment.url
end
Je reçois une erreur:
Cannot read file /Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022
PS: revérifié, le fichier existe. Même problème sur le serveur, pour tous les fichiers (images, vidéos, pdfs) dans tous les contrôleurs respectifs.
La solution
L'enjeu était:
J'utilisais
@image = Image.find(params[:id])
send_file "#{RAILS_ROOT}/public" + @image.attachment.url
Il doit être
@image = Image.find(params[:id])
send_file @image.attachment.path
PS:. Assurez-vous de vérifier que l'image / enregistrement existe
Autres conseils
Il suffit de changer la méthode d'URL par chemin:
send_file @image.attachment.path # this is the right way!.
Je ne sais pas comment vous enregistrez l'URL de l'image d'attache, mais en général, un nom de fichier voudrais:
/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png
Avis il n'a pas a "? Xxxxx" à la fin.
Vous pouvez vérifier votre système de fichiers, si le nom du fichier est « Screen Shot 2011-11-04 à 14.03.03 PM.png » ou « Screen Shot 2011-11-04 à 14.03.03 PM.png? 1320582022 » .
Pour url fichier, il peut-être quelque chose comme: http://example.com/xxx?dddd , quel caractère « ? » diviser le chemin d'accès et des paramètres. La chaîne « dddd » est un paramètre lorsque le chemin d'URL de demande, ce n'est pas une partie de chemin ou nom de fichier. Les paramètres prennent en charge que dans l'URL, pas au nom de fichier local.
Alors, je pense que vous devez vérifier le code de sauver url image en pièce jointe, qui ont besoin d'exclure les paramètres et que le nom de fichier. Et assurez-vous que le nom est exactement le même que le fichier enregistré sur le disque.
Et vous pouvez essayer d'ouvrir le fichier directement et bien irb vérifier la sortie:
>>> irb
irb> f = open('/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022')
D'autres, essayez de trouver l'emplacement d'erreur dans send_file et vérifiez le nom du fichier.
Je ne peux toujours pas faire en sorte que la question est vraiment, juste une suggestion.
Est-ce ?1320582022
appartiennent à son nom? Je ne sais pas sur les espaces blancs dans le nom de fichier soit, ils ont besoin peut-être être échappé.