ฉันมี URL ไปยังรูปภาพที่ฉันต้องการบันทึกในเครื่องเพื่อให้ฉันสามารถใช้คลิปหนีบกระดาษเพื่อสร้างภาพขนาดย่อสำหรับแอปพลิเคชันของฉัน วิธีที่ดีที่สุดในการดาวน์โหลดและบันทึกภาพคืออะไร? (ฉันดูการจัดการไฟล์ทับทิม แต่ไม่เจออะไรเลย)
ฉันมี URL ไปยังรูปภาพที่ฉันต้องการบันทึกในเครื่องเพื่อให้ฉันสามารถใช้คลิปหนีบกระดาษเพื่อสร้างภาพขนาดย่อสำหรับแอปพลิเคชันของฉัน วิธีที่ดีที่สุดในการดาวน์โหลดและบันทึกภาพคืออะไร? (ฉันดูการจัดการไฟล์ทับทิม แต่ไม่เจออะไรเลย)
คำตอบ:
ลองสิ่งนี้:
require 'open-uri'
open('image.png', 'wb') do |file|
file << open('http://example.com/image.png').read
end
IO.copy_stream(open('http://example.com/image.png'), 'destination.png')
require 'open-uri'
ใช้รหัสใต้
รุ่นที่สั้นกว่า:
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
Kernel#open
ไม่เพียง แต่ช่วยให้สามารถเข้าถึงไฟล์ได้เท่านั้น แต่ยังสามารถประมวลผลการร้องขอได้ด้วยการใส่สัญลักษณ์ไปป์ (เช่นopen("| ls")
) ดังนั้นจึงอาจนำไปสู่ความเสี่ยงด้านความปลอดภัยที่ร้ายแรงโดยใช้ตัวแปรอินพุตในการโต้แย้งของKernel#open
ดังนั้นจึงอาจนำไปสู่ความเสี่ยงด้านความปลอดภัยร้ายแรงโดยใช้การป้อนข้อมูลตัวแปรอาร์กิวเมนต์ของ