programing

URL에서 파일을 다운로드하여 레일즈에 저장하려면 어떻게 해야 합니까?

magicmemo 2023. 5. 31. 15:48
반응형

URL에서 파일을 다운로드하여 레일즈에 저장하려면 어떻게 해야 합니까?

로컬로 저장하고 싶은 이미지의 URL을 가지고 있어 Paperclip을 사용하여 응용프로그램의 썸네일을 생성할 수 있습니다.이미지를 다운로드하고 저장하는 가장 좋은 방법은 무엇입니까?(Ruby 파일 처리에 대해 알아봤지만 아무 것도 발견되지 않았습니다.)

사용해 보십시오.

require 'open-uri'
open('image.png', 'wb') do |file|
  file << open('http://example.com/image.png').read
end

더 짧은 버전:

require 'open-uri'
download = open('http://example.com/image.png')
IO.copy_stream(download, '~/image.png')

동일한 파일 이름을 유지하는 방법

IO.copy_stream(download, "~/#{download.base_uri.to_s.split('/')[-1]}")

PaperClip을 사용하는 경우 URL에서 다운로드가 자동으로 처리됩니다.

다음과 같은 것이 있다고 가정합니다.

class MyModel < ActiveRecord::Base
  has_attached_file :image, ...
end

모델에서 이미지를 URL로 지정하기만 하면 됩니다. 다음과 같은 것이 의도적으로 긴 손으로 작성됩니다.

@my_model = MyModel.new
image_url = params[:image_url]
@my_model.image = URI.parse(image_url)

모델에서 이를 메소드에 넣고 싶을 것입니다.이것은 또한 Heroku의 임시 파일 시스템에서도 잘 작동할 것입니다.

종이클립이 거기서 가져갈 겁니다.

출처: 페이퍼클립 설명서

저는 이것이 가장 확실한 방법이라고 생각합니다.

require 'open-uri'

File.write 'image.png', open('http://example.com/image.png').read

표준 라이브러리에서 Net::HTTP를 확인하십시오.설명서는 HTTP를 사용하여 문서를 다운로드하는 방법에 대한 몇 가지 예를 제공합니다.

가장 간단한 방법:

require 'open-uri'
image_url = "https://i.imgur.com/ZWnhY9T.png"
IO.copy_stream(URI.open(image_url), 'destination.png')

Ruby 3 이상을 사용하면 승인된 답변을 사용하면 다음 오류가 발생합니다.

해당 파일 또는 디렉토리 @rb_sysopen - http://example.com/image.png (Errno::ENONT)

해결책은 다음과 같습니다.URI.open대신에Kernel.open예:

require "uri"

download = URI.open('http://example.com/image.png')
File.write('~/image.png', download)

위의 예는 모두 훌륭합니다.저의 경우 URL의 이미지에서 다운로드 링크를 만들고 싶었습니다.

다운로드 폴더에 다운로드할 수 있도록 하려면 컨트롤러에서 다음 코드를 사용할 수 있습니다.

require 'open-uri'
file_type = url.to_s.split(".")[-1]

send_data open(url).read, filename: "some_name.#{file_type}", type: "image/#{file_type}", disposition: "attachment"

언급URL : https://stackoverflow.com/questions/2515931/how-can-i-download-a-file-from-a-url-and-save-it-in-rails

반응형