Ruby on Rails 2.1-파일 업로드
사이트 방문자가 서버에 파일을 업로드하기를 원하는 요구 사항이있을 수 있습니다. Rails를 사용하면 이러한 요구 사항을 매우 쉽게 처리 할 수 있습니다. 이제 간단하고 작은 Rails 프로젝트를 진행할 것입니다.
평소와 같이 새로운 Rails 애플리케이션으로 시작하겠습니다. upload. 간단한 rails 명령을 사용하여 응용 프로그램의 기본 구조를 만들어 보겠습니다.
C:\ruby> rails -d mysql upload
업로드 한 파일을 저장할 위치를 결정하십시오. 이것이data공개 섹션 내의 디렉토리. 따라서이 디렉터리를 만들고 권한을 확인하십시오.
C:\ruby> cd upload
C:\ruby\upload> mkdir upload\public\data
다음 단계는 평소와 같이 컨트롤러와 모델을 만드는 것입니다.
모델 생성
이것은 데이터베이스 기반 응용 프로그램이 아니기 때문에 우리가 편한 이름을 유지할 수 있습니다. 우리가DataFile 모델.
C:\ruby\upload> ruby script/generate model DataFile
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/data_file.rb
create test/unit/data_file_test.rb
create test/fixtures/data_files.yml
create db/migrate
create db/migrate/001_create_data_files.rb
이제 우리는 save 에 data_file.rb모델 파일. 이 메서드는 응용 프로그램 컨트롤러에 의해 호출됩니다.
class DataFile < ActiveRecord::Base
def self.save(upload)
name = upload['datafile'].original_filename
directory = "public/data"
# create the file path
path = File.join(directory, name)
# write the file
File.open(path, "wb") { |f| f.write(upload['datafile'].read) }
end
end
위의 함수는 CGI 개체를 사용합니다. upload 도우미 기능을 사용하여 업로드 된 파일 이름을 추출합니다. original_filename마지막으로 업로드 된 파일을 "public / data"디렉토리에 저장합니다. 도우미 함수를 호출 할 수 있습니다.content_type 업로드 된 파일의 미디어 유형을 알 수 있습니다.
여기 File 루비 개체이고 join 파일 이름과 함께 디렉토리 이름을 연결하고 전체 파일 경로를 반환하는 도우미 함수입니다.
다음으로, 쓰기 모드에서 파일을 열기 위해 우리는 File목적. 또한 전달 된 데이터 파일에서 데이터를 읽고 출력 파일에 씁니다.
컨트롤러 생성
이제 업로드 프로젝트를위한 컨트롤러를 만들어 보겠습니다.
C:\ruby\upload> ruby script/generate controller Upload
exists app/controllers/
exists app/helpers/
create app/views/upload
exists test/functional/
create app/controllers/upload_controller.rb
create test/functional/upload_controller_test.rb
create app/helpers/upload_helper.rb
이제 두 개의 컨트롤러 함수를 생성합니다. 첫 번째 기능index 사용자 입력을 받기 위해 뷰 파일을 호출하고 두 번째 함수는 uploadFile사용자로부터 파일 정보를 가져 와서 'DataFile'모델에 전달합니다. 업로드 디렉토리를 이전에 생성 한 '디렉토리 ='데이터 '' '업로드'디렉토리로 설정합니다.
class UploadController < ApplicationController
def index
render :file => 'app\views\upload\uploadfile.html.erb'
end
def uploadFile
post = DataFile.save( params[:upload])
render :text => "File has been uploaded successfully"
end
end
여기서는 모델 파일에 정의 된 함수를 호출합니다. 그만큼render 기능은 메시지를 표시 할뿐만 아니라 파일보기로 리디렉션하는 데 사용됩니다.
보기 만들기
마지막으로 뷰 파일을 생성합니다. uploadfile.rhtml,컨트롤러에서 언급했습니다. 이 파일을 다음 코드로 채우십시오-
<h1>File Upload</h1>
<% form_tag ({:action => 'uploadFile'},
:multipart => true) do %>
<p><label for="upload_file">Select File</label> :
<%= file_field 'upload', 'datafile' %></p>
<%= submit_tag "Upload" %>
<% end %>
여기서 모든 것은 이전 장에서 설명한 것과 동일합니다. 유일한 새 태그는file_field, 사용자 컴퓨터에서 파일을 선택하는 버튼을 만듭니다.
multipart 매개 변수를 true로 설정하면 작업이 파일의 이진 데이터를 제대로 전달하는지 확인할 수 있습니다.
여기서 주목해야 할 중요한 점은 "uploadFile" 메서드 이름으로 :action를 클릭하면 호출됩니다. Upload 단추.
다음과 같은 화면이 표시됩니다.
이제 파일을 선택하고 업로드합니다. 이 파일은 실제 파일 이름과 함께 app / public / data 디렉토리에 업로드되며 "파일이 성공적으로 업로드되었습니다"라는 메시지가 표시됩니다.
NOTE − 동일한 이름의 파일이 이미 출력 디렉토리에 존재하면 덮어 씁니다.
Internet Explorer에서 업로드 한 파일
Internet Explorer에는 전송 된 파일 이름에 파일의 전체 경로가 포함되어 있으므로 original_filename 루틴은 다음과 같은 것을 반환합니다-
C:\Documents and Files\user_name\Pictures\My File.jpg
대신-
My File.jpg
이것은 쉽게 처리됩니다 File.basename, 파일 이름 앞의 모든 것을 제거합니다.
def sanitize_filename(file_name)
# get only the filename, not the whole path (from IE)
just_filename = File.basename(file_name)
# replace all none alphanumeric, underscore or perioids
# with underscore
just_filename.sub(/[^\w\.\-]/,'_')
end
기존 파일 삭제
기존 파일을 삭제하려면 아주 간단합니다. 다음 코드를 작성하기 만하면됩니다.
def cleanup
File.delete("#{RAILS_ROOT}/dirname/#{@filename}")
if File.exist?("#{RAILS_ROOT}/dirname/#{@filename}")
end
에 대한 자세한 내용은 File 개체, 당신은 우리의 Ruby Reference Manual.