Rhapsodist

ruby

Rails에서 local file 업로드하기

2020.04.27

Created By Rhapsodist

Rhapsodist

Rails에서 local file 업로드하기

1. 개요

서버 내에서 file을 컨트롤 해야할 일이 생각보다 많다. 지금부터 단순히 파일을 읽고 쓰기가 아닌 upload (업로드)를 하는 방법을 알아보자.

2. 기본 code

# basic read
image = File.open(Rails.root.join('public', 'assets', 'target.jpg'), "r") {|io| io.read}
or
# binary read
image = File.open(Rails.root.join('public', 'assets', 'target.jpg'), "rb") {|io| io.read}

위의 코드는 보통 ruby에서 파일을 읽어올때 쓰는 코드이다. 그런데 문제는 파일의 내용을 불러오는 코드이기 때문에 파일을 전송하거나 path를 불러오는 역할은 하지 못한다. 해당 파일에 읽고 쓰기의 기능을 할때는 File.open() 함수를 사용하면 되지만, 직접 파일 자체로 컨트롤을 하고 싶다면 아래의 코드로 사용한다.

image = Pathname.new(Rails.root.join("/public/assets/target.jpg")).open

이 코드는 image를 path를 기준으로 읽어들여 파일 자체로써 사용가능하도록 해준다. 때문에 파일을 업로드 하라거나, path를 전송해야된다거나 할때 쓰면 파일 자체로써 사용할 수 있다.

3. 응용

3.1. db에 저장하기

user = User.create!(name: "Rhapsodist")
user.image = Pathname.new(Rails.root.join("/public/assets/target.jpg")).open
user.save!

위와 같이 파일 자체로 사용하거나 path로 사용하면 데이터 베이스에도 해당 파일을 path로써 저장하고 불러올때는 파일로써 사용할 수 있게 된다.

3.2. 다중 파일 저장

user.image = [
  Pathname.new(Rails.root.join("/public/assets/target1.jpg")).open,
  Pathname.new(Rails.root.join("/public/assets/target2.jpg")).open
]

다음과 같이 여러개의 파일을 배열(array)형식으로 저장도 가능하다.

3.3. 찾고자 하는 확장자의 파일만 찾아내기

@images = Dir.glob(Rails.root.join("/public/assets/*.jpg"))
@images.each do |i|
  id = File.basename(i).gsub('.jpg','');
  user = User.where(id: id).first;
  user.images = [Pathname.new(i).open];
end

Share to ...

#ruby
#rails
#upload
#local
#file