OK,交給File類別、ActionController::UploadedFile模組吧,
當然,上傳的照片只要放在public目錄或子目錄下就可以直接透過HTTP網址存取了!
1. 建立RESTful SOA Service - rails new
- 開啟終端機
- 輸入rails new picture_service,建立名為picture_service的SOA服務
- 於\config找到routes.rb
- 接下來我們將透過"post"和"get"方法宣告上傳與取得照片資訊的URI,並對應到Controller,讓Controller對資源的請求進行回應,如下:
PictureService::Application.routes.draw do
#上傳圖片的URI
post 'pictures' => 'pictures#create', :defaults => {:format => "json"}
#下載圖片URI
get 'pictures/:id' => 'pictures#find', :defaults => {:format => "json"}
end
3. Model儲存上傳的圖片資訊 - rails generate model
- 開啟終端機,並切換到picture_service目錄下
- 輸入"rails generate model picture filename:string"指令並執行,建立名為picture的Model,目的是用來保存上傳照片的資訊,其中filename則是保存實際儲存的檔名。
- 輸入"rake db:migrate"指令並執行,實際建立pictures資料表
4. Controller處理URI請求 - rails generate controller
- 開啟終端機,並切換到picture_service目錄下
- 敲入"rails generate controller pictures"指令並執行,建立名為pictures的Controller
- 於picture_service\app\controllers,開啟pictures_controller.rb
- 加入create方法,其會透過file參數取出上傳的照片,而後透過File類別實際儲存資料到public\pic目錄下,檔案的資訊在透過Picture model存在資料庫中,其中的filename欄位保存實際儲存在server上的檔案名稱。注意,在rails中儲在public目錄下的檔案是可直接透過HTTP網址存取得,也因為如此,我們將檔案存在public下的pic子目錄,目地是要讓存取照片的使用者可直接透過HTTP網址取得照片。
- 加入find方法,透過id取得Picture物件,找出檔案的資訊,並組合照片的網址回傳給存取照片的使用者
class PicturesController < ApplicationController
def create
#取得上傳的檔案,
#其自動會對應到ActionController::UploadedFile模組的物件
@uploaded_file = params[:file]
#建立picture model物件
@picture = Picture.new
if (@picture.save)
#取得副檔名,在與id組合存成新檔名
@extname = File.extname(@uploaded_file.original_filename)
@filename = @picture.id.to_s + @extname
@picture.filename = @filename
#再次存檔至資料庫
@picture.save
#將檔案寫入public/pic目錄下
File.open(Rails.root.join('public/pic', @picture.filename), 'wb') do |file|
file.write(@uploaded_file.read)
end
#回傳picture資訊
render json:@picture
else
render json:@picture.errors
end
end
def find
#依id取得picture資訊
@picture = Picture.find(params[:id])
#組合照片的網址
#注意,在此並未加上public目錄,
#public是預設隱藏的,
#只要在public下的檔案皆可直接存取。
@picture.filename ='http://' + request.host + ':' + request.port.to_s + '/pic/' + @picture.filename
render json:@picture
end
end
- 當然,最後別忘了在picture_service目錄下的public目錄中建立pic目錄
4. 啟動伺服器 - rails server
- 輸入rails server,透過rails server啟動伺服器,其預設的port為3000:
5. 測試 - Postman
- 上傳檔案
- URI:http://localhost:3000/pictures
- HTTP Method:POST
- Data:file => small_enginer.png
- 下載檔案
- URI:http://localhost:3000/pictures/1
- HTTP Method:GET
- Data:(none)