Rails에서 파일 업로드
저는 rails를 처음 사용하고 CRUD 기술을 사용하여 RESTful 웹 사이트를 작성하고 있습니다. 지금까지 사용자가 데이터베이스에서 행을 만들고, 편집하고, 삭제할 수있는 세 페이지를 만들었습니다. 그러나 네 번째 페이지는 업로드 파일 형식을 포함해야하지만 a) 파일 시스템이 Rails와 어떻게 작동하는지 모르기 때문에 파일을 어디에 저장해야하는지 모르겠습니다. 파일은 약 100kb이며 지속적으로 다운로드되기 때문에 임시 저장소에 저장할 수 없습니다. 그리고 b) 파일에 쓰는 방법을 모르겠습니다.
위에서 언급 한 작업을 수행하는 방법을 알려 주시면 좋을 것입니다. 입력 양식에 업로드 입력을 생성 한 다음 별도의 디렉토리에있는 파일 경로에 파일을 작성하는 것입니다.
2018 업데이트
아래에 기록 된 모든 내용이 여전히 유효하지만 이제 Rails 5.2에는 active_storage
S3 (또는 다른 클라우드 스토리지 서비스)에 직접 업로드, 이미지 변환 등과 같은 작업을 허용하는이 포함 되어 있습니다. 레일 가이드를 확인하고 필요에 맞는 것을 직접 결정해야합니다.
파일 업로드를 아주 멋지게 해결하는 많은 보석이 있지만 ( 목록 은 https://www.ruby-toolbox.com/categories/rails_file_uploads 참조 ), rails에는 자체 솔루션을 쉽게 롤링 할 수있는 내장 도우미가 있습니다.
file_field
양식에서 -form 도우미를 사용하면 rails가 업로드를 처리합니다.
<%= form_for @person do |f| %>
<%= f.file_field :picture %>
<% end %>
컨트롤러에서 다음과 같이 업로드 된 파일에 액세스 할 수 있습니다.
uploaded_io = params[:person][:picture]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
file.write(uploaded_io.read)
end
달성하고자하는 작업의 복잡성에 따라 다르지만 이는 쉬운 파일 업로드 / 다운로드 작업에 충분합니다. 이 예제는 rails 가이드에서 발췌 한 것입니다. 더 많은 정보를 얻으려면 http://guides.rubyonrails.org/form_helpers.html#uploading-files 를 방문하세요.
2018 년 9 월
최근에이 질문을 확인하는 사람을 위해 Rails 5.2+에는 이제 기본적으로 ActiveStorage가 있으며 확인하는 것이 좋습니다.
이제 핵심 Rails 5.2+의 일부이기 때문에 매우 잘 통합되어 있으며 즉시 사용할 수있는 뛰어난 기능을 제공합니다 (Carrierwave, Shrine, paperclip과 같은 다른 모든 잘 알려진 보석은 여전히 훌륭하지만 이것은 매우 새로운 Rails 프로젝트에 대해 고려할 수있는 좋은 기능)
Paperclip 팀은 Rails ActiveStorage를 위해 gem을 더 이상 사용하지 않습니다.
다음은 ActiveStorage에 대한 github 페이지이며 모든 곳에서 많은 리소스를 사용할 수 있습니다.
또한이 비디오 는 Activestorage의 기능을 이해하는 데 매우 유용 하다는 것을 알았습니다.
특히 파일 업로드를위한 멋진 보석이 있습니다 : carrierwave . 위키가 도움이되지 않는다면, 그것을 사용하는 가장 좋은 방법에 대한 멋진 RailsCast 가 있습니다. 요약하면 file
Rails 양식에는 파일 업로드 대화 상자를 호출 하는 필드 유형 이 있습니다. 당신은 그것을 사용할 수 있지만 '마법'은 carrierwave
gem에 의해 수행됩니다 .
"파일에 쓰는 방법"이 무엇을 의미하는지 모르겠지만 이것이 좋은 시작이되기를 바랍니다.
괜찮아. 파일을 데이터베이스에 저장하지 않고 자산 (사용자 지정 폴더)과 같이 응용 프로그램에 저장하지 않으려면 attr_accessor : document에 정의 된 비 DB 인스턴스 변수를 정의 form_for - f.file_field
하고 파일을 가져 오는 데 사용할 수 있습니다.
컨트롤러에서
@person = Person.new(person_params)
여기에 person_params
화이트리스트 반환 params[:person]
(직접 정의)
다른 이름으로 파일 저장,
dir = "#{Rails.root}/app/assets/custom_path"
FileUtils.mkdir(dir) unless File.directory? dir
document = @person.document.document_file_name # check document uploaded params
File.copy_stream(@font.document, "#{dir}/#{document}")
참고이 경로를 추가 .gitignore
및이 파일을 사용하려면 다시이 경로를 추가 asset_path
함으로써 애플리케이션의를application.rb
파일 필드를 읽을 때마다 tmp 폴더에 저장되고 나중에 귀하의 장소에 저장할 수 있으며 자산에 저장하는 예제를 제공했습니다.
참고 : 이와 같은 파일을 저장하면 응용 프로그램의 크기가 증가하므로 paperclip
.
intiallizer / carrierwave.rb에서
if Rails.env.development? || Rails.env.test?
config.storage = :file
config.root = "#{Rails.root}/public"
if Rails.env.test?
CarrierWave.configure do |config|
config.storage = :file
config.enable_processing = false
end
end
end
이것을 사용하여 로컬에서 실행하는 동안 파일에 저장하십시오.
참고URL : https://stackoverflow.com/questions/14174044/uploading-a-file-in-rails
'Development Tip' 카테고리의 다른 글
Ruby on Rails Routes-get과 match의 차이점 (0) | 2020.11.04 |
---|---|
Android는 모든 것 위에 뷰를 오버레이합니까? (0) | 2020.11.04 |
내 포함 가드가 재귀 적 포함 및 다중 기호 정의를 방지하지 않는 이유는 무엇입니까? (0) | 2020.11.04 |
angularjs에서 제출시 유효성 검사 오류 메시지 표시 (0) | 2020.11.04 |
haskell의 attoparsec 또는 parsec (0) | 2020.11.04 |