¿Cómo adjuntar una imagen a través de ActiveStorage directamente desde web url?

Espero una manera muy simple de adjuntar una imagen de un url

Esperaba que esto funcionara.

u = User.first
u.image.attach("https://i.pinimg.com/originals/24/17/d6/2417d6b3f3dc236b0b5b80fb00b3a791.png")

He mirado alrededor de 20 publicaciones de SO que abordan temas relacionados (muchos alrededor de cómo adjuntar una imagen del sistema de archivos) pero no puede encontrar una conexión de un url

Pregunta hecha hace 3 años, 4 meses, 26 días - Por phpphoenix


3 Respuestas:

  • Puede utilizar el módulo open-uri.

    require 'open-uri'
    
    image = URI.open('https://i.pinimg.com/originals/24/17/d6/2417d6b3f3dc236b0b5b80fb00b3a791.png')
    u.image.attach(io: image, filename: 'name.png', content_type: 'image/png')
    u.save!
    

    Respondida el Dec 19, 2020 a las 14:08 - por Kairo

    Votos positivos: 0 | Votos negativos: 0

  • Active Storage permite adjuntar archivos a un modelo en Rails, pero lamentablemente no puede adjuntar directamente archivos desde una URL como lo estás intentando.

    Para lograr adjuntar una imagen desde una URL, tendrás que descargar la imagen primero y luego adjuntarla al modelo. Aquí te muestro un ejemplo de cómo podrías lograr esto:

    ruby
    require 'open-uri'
    
    u = User.first
    
    

    Descargar la imagen desde la URL

    downloaded_image = open("https://i.pinimg.com/originals/24/17/d6/2417d6b3f3dc236b0b5b80fb00b3a791.png")

    Adjuntar la imagen descargada al modelo

    u.image.attach(io: downloaded_image, filename: "imagen.png", content_type: downloaded_image.content_type)

    En este caso, utilizamos open-uri para descargar la imagen desde la URL proporcionada y luego adjuntamos esa imagen al usuario usando attach.

    Espero que esta solución te sea de utilidad. ¡Déjame saber si tienes alguna otra duda!

    Respondida el Dec 20, 2020 a las 14:04 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Puedes adjuntar una imagen a través de una URL utilizando ActiveStorage de la siguiente manera:

    ruby
    u = User.first
    u.image.attach(io: open("https://i.pinimg.com/originals/24/17/d6/2417d6b3f3dc236b0b5b80fb00b3a791.png"), filename: "profile_image.png", content_type: "image/png")
    

    El método attach toma un objeto IO como primer argumento, que en este caso se crea abriendo la URL de la imagen. Los argumentos filename y content_type son opcionales, pero se recomienda proporcionarlos para una mejor organización y seguridad.

    Ten en cuenta que la imagen debe ser accesible públicamente desde la URL. Si la imagen está protegida por un firewall o requiere autenticación, deberás utilizar un enfoque diferente, como descargar la imagen y adjuntarla desde el sistema de archivos.

    Respondida el Dec 20, 2020 a las 14:14 - por Gemini

    Votos positivos: 0 | Votos negativos: 0