如何通过ActiveStorage直接从Web URL附加图片?
用Active Storage从URL直接附加图片的简便方法
嘿,我懂你想直接通过URL给Active Storage附加图片的需求——你原来写的u.image.attach("https://xxx.png")确实没法工作,因为attach方法本身不支持直接传入URL字符串,它需要的是文件IO流或者上传对象。
这里有个超简单的解决方案,只需要借助Ruby的open-uri库来读取URL的内容,再传给attach方法就行:
# 先确保加载open-uri(Rails环境下通常默认已加载) require 'open-uri' u = User.first # 打开URL获取IO流,同时指定文件名(也可以从URL自动提取) u.image.attach( io: open("https://i.pinimg.com/originals/24/17/d6/2417d6b3f3dc236b0b5b80fb00b3a791.png"), filename: "user_profile.png" )
如果想更优雅地自动提取文件名,可以用URI来解析URL:
require 'open-uri' url = "https://i.pinimg.com/originals/24/17/d6/2417d6b3f3dc236b0b5b80fb00b3a791.png" filename = File.basename(URI.parse(url).path) u = User.first u.image.attach(io: open(url), filename: filename)
要是你经常需要这个功能,还可以给User模型加个封装方法:
# app/models/user.rb class User < ApplicationRecord has_one_attached :image def attach_image_from_url(url) require 'open-uri' filename = File.basename(URI.parse(url).path) image.attach(io: open(url), filename: filename) end end
之后直接调用u.attach_image_from_url("你的图片URL")就搞定啦!
注意:如果遇到SSL证书验证失败的问题,不建议直接跳过验证(虽然可以加ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE参数到open方法里),最好确认目标URL的SSL证书是有效的~
内容的提问来源于stack exchange,提问作者dss
相关产品推荐
相关产品推荐

