如何使用Active Storage从URL存储图像

时间:2018-06-29 06:01:50

标签: ruby-on-rails image-uploading imageurl rails-activestorage ruby-on-rails-5.2

我的问题是关于:使用Active Storage时如何从URL上传图像。我在此处使用了Stackoverflow中其他post的代码,但是通过了模型方法,即需要存储在表中的参数。奇怪的是,我收到了下一个错误:

ActiveSupport::MessageVerifier::InvalidSignature in PostsController#update

但是当我从这个模型重新加载显示视图时,图像似乎存储并部署在我的帖子视图中。

发布模型中,我的代码是

class Post < ApplicationRecord
  require 'open-uri'

  has_one_attached :image_one
  has_one_attached :image_two
  has_one_attached :url_image

  before_save :grab_image

  
  def grab_image(url)
    downloaded_image = open(url)
    self.url_image.attach(io: downloaded_image, filename: "map.jpg", content_type:"image/jpg")
  end
  
end

这是我的 Controller 的“编辑操作”中的代码:

  def update
    @posturl = params[:post][:url_image]
    @post.grab_image(@posturl)
    respond_to do |format|
      if @post.update!(post_params)
        format.html { redirect_to @post, notice: 'Post was successfully updated.' }
        format.json { render :show, status: :ok, location: @post }
      else
        format.html { render :edit }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end

Apparently, the record is saved but i receive this problem

我获得了以下链接,这些链接讨论了从URL上传图像的机会,但是,我不知道还能做什么:

Active Storage Overview - EdgeGuides

@omnilord/rails-5-2-activestorage-mitigating-adoption-pitfalls

4 个答案:

答案 0 :(得分:2)

也许对你有用:

file = open(url)
user.image.attach(io: file, filename: "temp.#{file.content_type_parse.first.split("/").last}", content_type: file.content_type_parse.first)

答案 1 :(得分:2)

无需显式输入文件名的最简单方法是:

require 'open-uri'

url = URI.parse("https://your-url.com/abc.mp3")
filename = File.basename(url.path)
file = URI.open
user = User.first
user.avatar.attach(io: file, filename: filename)

这会自动针对该特定用户对象保存化身。

如果您使用的是S3之类的远程服务,则可以通过以下方式检索URL:

user.avatar.service_url

答案 2 :(得分:0)

这里是一个例子:

file_url = image[:image_url]
download = open(file_url)
IO.copy_stream(download,
user.image.attach(
  io: download,
  filename: image[:name],
  content_type: image[:content_type],
))

答案 3 :(得分:0)

编辑时,您需要提供附加 blob 的签名 ID,以防用户未对图像进行任何更改。

像下面这样的东西应该可以工作。您需要在表单中进行此更改。

<%= form.file_field :image_one, value: image_one.blog.signed_id %>