J'utilise PaperClip pour permettre aux utilisateurs de joindre des objets, puis j'envoie un email et je voulais joindre le fichier à l'e-mail. J'essaie de lire le fichier dans et de l'ajouter sous la forme d'une pièce jointe, comme: Cela me donne l'erreur suivante Comment puis-je résoudre ce problème? p> p> Aucun fichier ou répertoire de ce type / système / fichiers / 7 / Original / Image.png? 1254497688 Code> Avec la trace de la pile disant que c'est l'appel à
fichier.lead code>. Lorsque je visiterai la page
show.html.erb code>, puis cliquez sur le lien vers l'image, qui est quelque chose comme
http: // localhost: 3000 / système / fichiers / 7 / Original / image.png? 1254497688 code>, l'image est affichée bien. p>
4 Réponses :
typiquement fichier.Lead attend un chemin de fichier, pas une URL cependant. Si vous générez les images, vous devez appeler le code de génération d'images et renvoyer les octets de l'image générée au lieu d'appeler root_url code> devrait fournir ceci. p>
fichier.read (...) code> p> p> p>
Je ne les générais pas, je laisse l'utilisateur les télécharger et les stocker sur le système de fichiers
Mais quand je spécifie le fichier FilePath (via la méthode Asset.url), je reçois une erreur en disant qu'il ne peut pas trouver le fichier; Cependant, lorsque je le lie (E.g. link_to Asset.name.name, Asset.url) Cela fonctionne bien et je peux voir l'image.
Essayez fichier.read (fichier.join (rails.root, "public", asset.url)) code> (en supposant que les images figurent sur le système de fichiers sous
public / système / fichiers / ... < / code>.
HMM Le problème semble être la chaîne de caractères qu'il ajoute après le nom de fichier, essayant ce que Cwninja a dit que je reçois l'erreur "argument invalide". Y a-t-il un moyen d'obtenir le chemin de base vers le fichier sans que gobbeldygook après elle?
Asset.url.gsub (/\?.*/, "") code> comme solution rapide?
(Évidemment, vous devriez envelopper tout ce ick up dans votre modèle, # données code> peut-être?)
Cela fonctionne, mais maintenant, je reçois une erreur de permission refusée lorsque j'essaie de lire le fichier, bien que les rails aient la permission de sauvegarder le fichier dans le dossier.
L'autorisation refusée semble être dans le répertoire racine (par exemple C: \ Documents \ Wayne \ Projects \ Portail \) mais Rails est capable de faire tout le reste vers ce répertoire. Peut-être que cela a à voir avec le fait que cela se fait via un mailer et non un contrôleur?
Le contrôleur VS du mailer ne doit pas faire de différence. Comme vous êtes sur Windows (BOOOOOOO!), Vous devrez peut-être faire un fichier .read (fichier.join (rails.root, "public", * attes.url.gsub (/\?.*/, " ") .Split (" / ")) code>. Il peut essayer de lire
C: \ Documents \ Wayne \ Projects \ Portail \ Public \ System / Fichiers / 7 / ORI ginal / image.png code> qui ne ressemble pas à un nom de fichier windows (booooooo!) valide.
vous voulez hth. p> Asset.url code> renvoie l'URL dans le fichier. Ceci est généralement
/system/classname/xx/xx/style/filename.ext code>. Vous mettriez cela dans un
image_tag code>. P>
Asset.Path code>. Il renvoie le chemin complet du fichier, qui sera généralement quelque chose comme
/home/username/railsapp/public/system/classname/xx/xx/style/filename.ext code> p>
Comme ZiggyTheHamster dit: l'Aser.url est l'URL générée qui serait utilisée sur les pages Web (c'est pourquoi vous obtenez la répertoire de style UNIX, comme indiqué dans les commentaires.)
ACTIF. Chemin devrait vous donner le chemin d'accès au système d'exploitation au fichier, mais même ce n'est pas nécessaire avec le papier. PaperClip :: La pièce jointe est déjà un iostream. P>
Vous avez juste besoin de : corps => actif code> comme: p>
request.env["HTTP_HOST"] I don't know why this one line of code is so elusive on the web. Seems like it should be up front and center.
Cela fonctionnait bien jusqu'à ce que j'essayais de l'utiliser dans un mailer rails et courait dans cette méthode non définie «env» pour Nil: nilclass code> de sorte que cela ne fonctionne pas partout.
Pour autant que je sache, la demande code> n'existe pas dans les expéditeurs. C'est pourquoi vous devez définir spécifiquement une valeur pour l'hôte. Vous ne savez pas pourquoi cela continue à être voté?
Ceci est insécurisé! b> L'en-tête "http_host" est défini par l'utilisateur et un utilisateur malveillant pourrait le changer à tout ce qu'il / elle veut lors de la soumission d'une demande. Cela pourrait signifier que les liaisons de réinitialisation du mot de passe peuvent être envoyées au serveur de quelqu'un d'autre, ou des images pourraient être modifiées, etc. N'utilisez pas ce b>