Как я могу загрузить изображение в Интернете с URL-адреса и сохранить его локально в Rails? - PullRequest
0 голосов
/ 14 января 2019

Как я могу загрузить изображение в Интернете с URL и сохранить его локально в Rails?

я даю форму для добавления URL-адреса изображения ссылку на форму если я отправляю эту форму, я хочу загрузить изображение на локальный диск компьютера (Главная / Документы / food_img)

просьба помочь

в загружаемом контроллере

class DownloadsController < ApplicationController
    def index
        @downloads = Download.all
        @download = Download.new
    end

    def create
        @download = Download.create(user_params)
    end

    private

    def user_params
        params.require(:download).permit(:image,:image_url)
    end
end

в представлении / index.html.erb

<%= form_for(@download, url: downloads_path) do |f| %>
<%= f.text_field :image_url %>
<%=f.submit%>
<% end %>

в модели

class Download < ApplicationRecord
    has_attached_file :image, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
    validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/

    require 'open-uri'
    download = open('http://www.shopprod.com/assets/photos/ishop-718755d2bc62956994c867681b2622e77b4c9af3d1ecd6fa856127b704a459b2.png')
    IO.copy_stream(download, "~/#{download.base_uri.to_s.split('/')[-1]}")
end

в дБ

t.string: image_url

1 Ответ

0 голосов
/ 14 января 2019

Если вы используете ActiveStorage (что я бы порекомендовал), вы можете использовать .attach, чтобы присоединить поток ввода-вывода к записи.

Дано:

class Download < ApplicationRecord
  has_one_attached :image
end

С консоли rails вы можете скачать файл и прикрепить его с помощью:

require 'open-uri'
uri = 'http://www.shopprod.com/assets/photos/ishop-718755d2bc62956994c867681b2622e77b4c9af3d1ecd6fa856127b704a459b2.png'
download = Download.new
download.image.attach(io: open(uri), filename: uri.split('/').last)

Тем не менее, вы не можете просто так бросить его в свой модельный класс и ожидать, что оно сработает. Тело класса выполняется, когда класс читается.

Вместо этого вам нужно поместить его в метод и вызвать его в правильной точке.

class Download < ApplicationRecord
  has_one_attached :image
  def download_image!
    require 'open-uri'
    image.attach(
      io: open(self.image_url), 
      filename: self.image_url.split('/').last
    )
  end
end

class DownloadsController < ApplicationController
  def create
    @download = Download.new(download_params)
    if !@download.image.attached? && @download.image_url
      @download.download_image!
      # @todo handle errors 
    end
    if @download.save
      redirect_to @download
    else 
      render :new
    end
  end

  def download_params
    params.require(:download)
          .permit(:image, :image_url)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...