Rendu d'une image
Donc, cela devrait être assez facile, mais je ne peux pas le faire fonctionner.
J'ai un contrôleur de méthode qui trouve une image basée sur une requête, puis la sortie de mise en cache. L'image pourrait être à distance (flickr, google images, etc) ou il pourrait être local. Quelle que soit la source, j'ai juste besoin de prendre l'image le contenu du fichier, et le passer à travers à l'utilisateur. En essence, un proxy. En passant à travers des images à distance semble bien fonctionner, mais en passant à travers les images me donne:
invalid byte sequence in UTF-8
Voici donc ce que j'ai. J'espère que quelqu'un pourra résoudre le problème ou me guider dans une meilleure direction avec mon code.
def image_proxy
query = params[:query]
image_url = get_image_url(query) # returns an absolute local file path or a URL
response.headers['Cache-Control'] = "public, max-age=#{12.hours.to_i}"
response.headers['Content-Type'] = 'image/jpeg'
response.headers['Content-Disposition'] = 'inline'
render :text => open(image_url).read
end
À distance des fichiers fonctionnent correctement, les fichiers locaux ne pas.
Bonus à toute personne qui peut aider à résoudre cet autre problème:
- J'ai besoin de régler le bon type de contenu. Distance de l'image urls ne me dites pas le type d'image, je viens d'obtenir une url et parfois l'url ne contient pas une extension. Donc j'ai choisi jpeg, car il semble fonctionner quel que soit le type d'image qui me sont envoyés.
Merci!
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser
render :text => open(image_url, "rb").read
, qui dit à Ruby que le fichier, il s'ouvre est binaire, et de ne pas essayer de lire que du texte.modifier
Pour la question bonus, vous avez pu lire les premiers octets et de regarder ce qu'ils contiennent.
Un PNG commencez toujours avec le code hexadécimal de la valeur d'octet 89 50 4E 47 0D 0A 1A 0A (ou les valeurs décimales 137 80 78 71 13 10 26 10).
Wikipédia a un liste des numéros de magie utilisée pour identifier le fichier que vous pouvez regarder. Il suffit de créer une méthode de quelque sorte qui lit les premiers octets et la compare à celle.
Quelle est la version de Rails? Pour Rails 3, vous devriez regarder la méthodes de diffusion qui ont été ajoutés. send_data serait la bonne façon de l'envoi de données binaires. Si les images sont locales, et votre serveur web prend en charge, vous pouvez utiliser send_file qui ne les empêcheront pas de rails instance alors que l'utilisateur télécharge une image.
send_data
est ce que vous voulez, pasrender
.