開發 Web 應用程式
本指導教學教您如何使用 IBM Cloud® Object Storage來建置簡式影像展示區,並將許多不同的概念和實務結合在一起,成為 Web 開發的關鍵。
從開始到結束,建置 Web 應用程式涵蓋了許多不同的概念,是向您介紹 IBM Cloud Object Storage 特性的好方法。 您的應用程式使用 IBM Cloud Object Storage 來儲存在 Node.js 應用程式中,可讓使用者上傳及檢視 JPEG 影像檔。
實務範例
本指導教學的實務範例涉及許多移動組件:
- 管理 Web 應用程式的 Web 伺服器
- 命令列的使用
- 展示區中映像檔的儲存空間實例
- 整合到持續交付中的版本控制系統
- Script 及標記中的用戶端應用程式連結
- 要上傳及顯示的影像
如果您要在一個套件中尋找所有內容,本指導教學將為您提供完整、從開始到完成的範例。 不過,此指示只能暫時擱置安全及安全程式碼的原則。 實際投入正式作業的 Web 應用程式需要適當的安全保護,否則將不適合可能的訪客。
開始之前
確保您具有需要啟動的項目:
- IBM Cloud Platform 的帳戶
- Docker,作為 IBM Cloud Developer Tools 的一部分
- Node.js
- Git (桌面和命令列)
使用指令行
讓我們從開啟有經驗的開發人員所熟悉的工具,以及剛入門人員的最佳新朋友開始:指令行。 對於許多人,圖形使用者介面 (GUI) 將您電腦的指令行介面降級為二等狀態。 但現在是時候回復它了 (雖然 GUI 不會很快消失,尤其是當您需要瀏覽 Web 以下載指令行工具集的指示時)。
開啟 Shell 並建立目錄。 將您自己的參考目錄變更為您建立的新目錄。 建立後,您的應用程式有自己的子目錄,其中包含啟動和運行所需的起始程式碼和配置。
離開指令行並回到瀏覽器,以便您可以遵循指示來安裝鏈結上的 IBM Cloud 平台開發人員工具。 Developer Tools提供了一種可擴展且可重複的方法來建置和部署雲端應用程式。
安裝 Docker
使用容器 (例如 Docker) 可加速開發並簡化測試,並支援自動化部署。 容器是一種輕量級結構,不需要作業系統,只需要程式碼和從依賴項到設定的所有配置。
Docker 隨 Developer Tools一起安裝,且您需要它。 它的工作大多在搭建新應用程式的常式內的背景中進行。 Docker 必須在執行中,建置指令才能運作。 繼續在 Docker hub線上建立一個Docker帳戶,運行Docker應用程序,然後登入。
安裝 Node.js
您建立的應用程式使用 Node.JS作為伺服器端引擎來執行此 Web 應用程式的JavaScript程式碼。 若要使用Node套件管理器 ( npm
) 來管理應用程式的依賴項,您必須在本機安裝Node。 此外,Node 的本端安裝也可簡化測試,加快開發速度。
在開始之前,您可以考量使用版本管理程式 (例如 Node Version Manager 或 nvm
) 來安裝 Node。 版本管理程式可減少管理不同版本 Node.js的複雜性。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
……或 wget
(只需要一個,但不需要兩者;使用系統上可用的任何一個):
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
或者,對於 Windows,您可以使用 適用於 Windows 的 nvm
以及連結中的安裝程式和原始程式碼。
使用 nvm
,安裝 Node。
nvm install v6.17.1
無論您在電腦上安裝 Node.js 及 npm
(隨附於 Node) 之後使用何種方法,祝賀您工作順利開始!
安裝 Git
您可能已經熟悉 Git,因為它是最廣泛使用的原始碼版本化系統。 稍後在IBM Cloud平台中建立持續部署 (CD) 工具鏈時,您將使用Git進行持續交付和部署。 如果您沒有GitHub帳戶,請在 GitHub 網站上建立一個免費的公開個人帳戶;否則,請隨意使用您可能擁有的任何其他帳戶登入。
您需要產生 SSH 金鑰並上傳至 GitHub 設定檔,才能從指令行安全存取 GitHub。 不過,這樣做現在提供良好的作法,因為您稍後會針對用於 IBM Cloud Platform 的 GitHub 實例重複步驟。
現在,請下載 GitHub 桌面,並執行安裝程式。 當安裝程式完成時,請使用您的帳戶登入 GitHub。
輸入儲存庫的任何確定的名稱和電子郵件 (公開顯示)。 應用程式鏈結至您的帳戶之後,可能會要求您透過線上 GitHub 帳戶驗證應用程式連線。

建立 Node.js 入門範本應用程式
要開始在本地開發應用程序,請先直接從命令列登入IBM Cloud平台,如範例所示。 您可以指定選用參數,例如具有選項 -o
的組織及具有選項 -s
的空間。 如果您使用聯合帳戶,請使用 --sso
。
ibmcloud login
如所示鍵入指令,以下載並安裝本指導教學中使用的 CLI 延伸。
ibmcloud cf install
當您登入時,可能會要求您選擇地區。 在本練習中,請選取 us-south
作為地區,因為在本指導教學稍後會使用相同的選項來建置 CD 工具鏈。
接下來,設定端點 (如果尚未設定的話)。 其他端點是可能的,且可能適用於正式作業用途。 現在,如果適用於您的帳戶,請使用所顯示的程式碼。
ibmcloud api cloud.ibm.com
接下來,建立 Web 應用程式。 dev
空間是您組織的預設選項,但您可能偏好建立其他空間來隔離不同的工作。 例如,將 'finance' 與 '開發' 分開。
ibmcloud dev create
有了這個命令你就會被問一系列問題 您可以在處理程序中的許多點回復,因此如果您覺得遺失,可以從刪除現有目錄並建立新目錄重新開始。 即使在指令行上建立應用程式,您仍會在 IBM Cloud 主控台中看到結果。
請注意用於建立「Web 應用程式」的選項。 那是你想要的
===============================================================================
Select an application type:
1. Backend Service / Web App
2. Mobile App
-------------------------
0. Exit
===============================================================================
? Enter selection number:> 1
提供了許多選項,但您想要 'Node'。 鍵入 '4',然後按 Enter 鍵。
===============================================================================
Select a language:
1. Go
2. Java - MicroProfile / Java EE
3. Java - Spring
4. Node
5. Python - Django
6. Python - Flask
7. Swift
-------------------------
0. Return to the previous selection
===============================================================================
? Enter selection number:> 4
在您選擇程式設計語言和架構之後,下一個選擇將會有許多選項,它可能會捲動瀏覽您想要的服務。 如您在範例中所見,您想要搭配使用簡式 Node.js Web 應用程式與 Express.js。鍵入 '3' 並按 Enter 鍵。
===============================================================================
Select a Starter Kit:
APPSERVICE
-------------------------------------------------------------------------------
1. Node-RED - A starter to run the Node-RED open-source project on
IBM Cloud.
2. Node.js + Cloudant - A web application with Node.js and Cloudant
3. Node.js Express App - Start building your next Node.js Express
app on IBM Cloud.
WATSON
-------------------------------------------------------------------------------
4. Natural Language Understanding Node.js App - Use Watson Natural
Language Understanding to analyze text to help you understand its
concepts, entities, keywords, sentiment, and more.
5. Speech to Text Node.js App - React app using the Watson Speech to
Text service to transform voice audio into written text.
6. Text to Speech Node.js App - React app using the Watson Text to
Speech service to transform text into audio.
7. Visual Recognition Node.js App - React app using the Watson
Visual Recognition service to analyze images for scenes, objects, text,
and other subjects.
-------------------------
0. Return to the previous selection
===============================================================================
? Enter selection number:> 3
各地開發人員仍需要最難的選項: 命名您的應用程式。 遵循範例並鍵入 webapplication
,然後按 Enter 鍵。
? Enter a name for your application> webapplication
稍後,您可以根據需要透過 Web 控制台新增任意數量的服務,例如資料儲存或運算功能。 不過,當詢問您是否要立即新增服務時,鍵入 ' n' 表示 no。 此外,如果您尚未設定資源群組,此時可能會提示您。 您可以在此提示中鍵入 ' n' 來跳過此動作。
Using the resource group Default (default) of your account
? Do you want to select a service to add to this application? [Y/n]> n
管理容器化應用程式的一種方法是使用編排軟體,例如Kubernetes,它是開發中的_事實上的_標準。
輸入「4」並按 Enter 鍵以使用「IBM DevOps'將 CD 整合到專案生命週期中。
===============================================================================
Select from the following DevOps toolchain and target runtime environment
options:
1. IBM DevOps, deploy to Knative-based Kubernetes containers
2. IBM DevOps, deploy to Helm-based Kubernetes containers
3. IBM DevOps, deploy to Helm-based Red Hat OpenShift containers
4. No DevOps, with manual deployment
===============================================================================
? Enter selection number:> 4
您必須選擇自動化部署 CD 工具鏈的地區。 請選取參照先前所選的相同區域 '5' 的選項。
--------------------------------------------------------------------------------
Select a region for your toolchain from the following options:
--------------------------------------------------------------------------------
1. eu-de (Frankfurt)
2. eu-gb (London)
3. jp-tok
4. us-east (Washington DC)
5. us-south (Dallas)
--------------------------------------------------------------------------------
0. Return to the previous selection
--------------------------------------------------------------------------------
? Enter selection number:> 5
產生新的應用程式會提醒我們用來部署應用程式的工具鏈需要一些其他配置。 如前所述,需要將公鑰上傳到GitHub (在IBM Cloud平台上的 CD 工具鏈實例中)才能使用GitHub交付已部署的應用程式。
Note: For successful connection to the DevOps toolchain, this machine
must be configured for SSH access to your IBM Cloud GitLab account at
https://git.cloud.ibm.com/profile/keys in order to download the
application code.
進一步提示確認您先前定義的應用程式和工具鏈名稱。 此範例展示如何根據需要變更主機和工具鏈名稱。 對於應用程式的服務端點而言,主機名稱必須是唯一的,但除非發生衝突,您只要在要求確認時按「返回」即可。
The DevOps toolchain for this app will be: webapplication
? Press [Enter] to accept this, or enter a new value now>
The hostname for this app will be: webapplication
? Press [Enter] to accept this, or enter a new value now>
The app webapplication has been created in IBM Cloud.
DevOps toolchain created at
https://cloud.ibm.com/devops/toolchains/6ffb568a-e48f-4e27-aed0-00ca931dde66?env_id=ibm:yp:us-south
如果您複製並貼上 ibmcloud dev create
指令所傳回的鏈結,您也可以存取 CD Toolchain。 您可以稍後從控制台訪問該鏈接,以防您錯過捕獲鏈接。 以下是進一步資訊,因為處理程序會繼續在線上建立應用程式項目,以及具有範例程式碼的目錄。
Cloning repository
https://git.cloud.ibm.com/Organization.Name/webapplication...
Cloning into 'webapplication'...
remote: Counting objects: 60, done.
remote: Compressing objects: 100% (54/54), done.
remote: Total 60 (delta 4), reused 0 (delta 0)
Receiving objects: 100% (60/60), 50.04 KiB | 1.52 MiB/s, done.
Resolving deltas: 100% (4/4), done.
OK
The app, webapplication, has been successfully saved into the
current directory.
最後一條語句表示如果您查看目前目錄,現在可以看到一個新的子目錄 webapplication
。 此目錄保留新 Node.js 應用程式的支架。 不過,雖然秘訣可能存在,但配料本身仍會包裝在 Docker 映像檔中,且必須結合。 安裝後,Docker正在本機上運行,但如果您需要重新啟動它,請這樣做。 如果您在未執行 Docker 的情況下建置新的 Web 應用程式,它會失敗,但這不是唯一可能的錯誤。 如果您遇到問題,請檢查產生的錯誤訊息,其中可能包含相應的鏈接,可用於在您的IBM
Cloud平台帳戶的線上門戶中查看結果日誌。
ibmcloud dev build
現在已建置應用程式,您可以使用 run
指令在本端執行程式碼。 完成後,將提供的 URL 複製並貼上到瀏覽器的網址列中,通常為 http://localhost:3000
。
ibmcloud dev run
現在,已建立並定義應用程式,請檢視應用程式以確認它可以運作。 如果您看到如圖 2 所示的佔位符影像,那麼幹得好! 您已經建立了一個新的Node.js Web 應用程式並準備將其部署到雲端。

使用 deploy
指令將應用程式部署到IBM Cloud平台(如範例所示)。
ibmcloud dev deploy
ibmcloud dev deploy
會根據您先前指定的地區端點及主機名稱,再次顯示 URL。 您可以在 IBM Cloud Platform 中查看入口網站所儲存日誌的鏈結。 請繼續並造訪雲端中的新 Web 應用程式!
建立「Web 展示區」應用程式
讓我們回想一下在IBM Cloud平台上開發Node.js應用程式所需的先決條件。 您已建立 IBM Cloud Platform 帳戶,並安裝已安裝 Docker 的 Developer Tools。 然後,您安裝了 Node.js。列為本指導教學必備項目的最後一個項目是 Git,您現在可以進入此指導教學。
我們將在 Node.js中開始使用映像檔展示區的特性。現在,針對此實務範例使用 GitHub 桌面,但您也可以使用 Git 指令行用戶端來完成相同的作業。 首先,為您的新 Web 應用程式複製一個入門範本。
請遵循下列程序:
-
在這裡下載範例: download。 使用瀏覽器將應用程式的範本下載到本機開發環境。 不要從IBM Cloud平台克隆範例應用程序,而是使用範例中的命令來取得IBM Cloud Object Storage Web Gallery 應用程式的入門範本。 複製儲存庫之後,您會在 COS-WebGalleryStart 目錄中找到入門範本應用程式。 開啟 Git CMD 視窗,然後切換至您要複製 Github 儲存庫的目錄。 一旦完成,請使用本指導教學第一個範例中顯示的指令,開始新增檔案。
curl images/image-gallery-tutorial.zip -o image-gallery-tutorial.zip
-
在本端執行應用程式。 開啟終端機,並將工作目錄切換至
COS-WebGalleryStart directory
。 請注意 package.json 檔案中列出的 Node.js 相依關係。 使用接下來顯示的指令,將它們下載至適當的位置。npm install
-
使用所顯示的指令來執行應用程式。
npm start
打開瀏覽器並在輸出到控制台
http://localhost:3000
位址和連接埠上查看您的應用程式。要在本地重新啟動應用程序,請終止節點進程 (Ctrl+C) 以停止它,然後再次使用
npm start
。 使用nodemon
會改為在偵測到變更時重新啟動應用程式,並節省您的時間。 像這樣全域安裝nodemon
:npm install -g nodemon
。 使用以下命令從應用程式目錄中的命令列運行它:nodemon
來啟動您的應用程式。 -
準備好準備應用程式進行部署! 如有必要,將COS-WebGallery,中
manifest.yml
檔案中的應用程式名稱屬性值更新為您在IBM Cloud平台上為應用程式輸入的名稱以及範例中所示的其他資訊。 應用程式manifest.yml
看起來類似下列範例。 您可以使用應用程式的名稱和您的作者姓名來自訂位於應用程式根目錄中的package.json
檔案。applications: - path: . memory: 256M instances: 1 domain: us-south.cf.appdomain.cloud name: webapplication host: webapplication disk_quota: 1024M random-route: true
現在您可能需要設定 SSH 金鑰以互動方式將程式碼推送到遠端來源。 如果您為 SSH 金鑰設定密碼,則每次將變更推送到儲存庫的遠端來源時都需要輸入此程式碼。
-
刪除
webapplication
目錄的內容並將其替換為您修改的目錄COS-WebGalleryStart
的內容。 使用精細調整的 Git 技能,新增已刪除並使用 CLI 或 Github Desktop 新增至儲存庫的檔案。 然後,將變更推送至儲存庫原點。 將來,您只需將變更推送到Git即可對基於雲端的 Web 應用程式進行變更。 在複製您的變更並將其儲存在伺服器上後,CD 工具鏈將自動重新啟動伺服器進程。
本質上,您已經重新編碼了應用程序,因此請重複建置過程。 但這次使用新的圖片庫程式碼。
將應用程式部署至 IBM Cloud Platform。
若要使用您對 IBM Cloud Platform 的變更來取得入門範本應用程式,請重複您先前執行的相同步驟,以使用 Developer Tools 來部署它。
-
如果您尚未登錄,或已重新啟動或登出,請使用
login
指令登入IBM Cloud平台。ibmcloud login
-
使用
api
指令來設定地區的 API 端點。ibmcloud api cloud.ibm.com
-
使用建置命令建置應用程式以交付該應用程式(如範例所示)。
ibmcloud dev build
- 繼續並在本端測試應用程式。 這可讓您使用
run
指令在本端執行相同的程式碼。
ibmcloud dev run
- 繼續並在本端測試應用程式。 這可讓您使用
-
使用
deploy
指令將應用程式部署至 IBM Cloud Platform。ibmcloud dev deploy
該程式碼顯示了本範例中用於建置、測試和部署初始 Web 應用程式的命令序列。
ibmcloud login --sso ibmcloud api cloud.ibm.com ibmcloud target --cf ibmcloud dev enable ibmcloud dev build ibmcloud dev run ibmcloud dev deploy
當程序完成時,IBM Cloud 平台會報告已上傳、順利部署並啟動應用程式。 如果您也登入了IBM Cloud平台 Web 控制台,您也會收到應用程式狀態的通知。 但是,最重要的是,您可以使用瀏覽器來造訪 IBM Cloud Platform 所報告的應用程式 URL,或從 Web 主控台按一下「檢視應用程式」按鈕,來驗證已部署該應用程式。
測試應用程式。 建立時部署至下面所示的入門範本應用程式的預設應用程式範本的可見變更,證明已成功將應用程式部署至 IBM Cloud Platform。
查看部署的應用程式的結果。
建立 Git 分支
現在,您需要為本端開發環境建立分支,以用於「IBM Cloud Platform Delivery Pipeline 建置階段」:
-
如果使用GitHub Desktop,請點選分支圖示;系統會提示您輸入分支的名稱。 此範例使用
local-dev
作為名稱。使用GitHub Desktop 建立本地開發分支 -
建立分支後,GitHub會將 Local-dev 分支上的本機檔案與預設分支上的儲存庫中的檔案進行比較,並報告「無本機變更」。 您現在可以按一下「發佈」,將您在本端儲存庫上建立的分支新增至 GitHub 儲存庫(如圖 5 所示)。
將您的 git 分支發佈到儲存庫的遠端來源
現在,Local-dev 分支已發佈到工具鏈中的GitHub存儲庫,只要您將提交推送到,就會觸發IBM Cloud平台Delivery Pipeline的構建階段,然後是部署階段它。 無需從 CLI 部署應用程序,因為部署已直接整合到您的工作流程中。
設定您的儲存憑證
您需要配置 Web 應用程式的 Object Storage 認證,以及它將儲存及擷取影像的「儲存區」。 您將建立的 API 金鑰需要Object Storage HMAC 憑證,如您的 服務憑證 所定義。 您可能會認識術語 access_key_id
和 secret_access_key
,因為您可能擁有AWS帳戶,並使用已包含 aws_access_key_id
和 aws_secret_access_key
條目的憑證檔案。
在您已完成建立 API 金鑰、下載並複製 HMAC 認證之後,請完成下列步驟:
-
在本端開發環境上,將認證放置在 Windows 路徑
%USERPROFILE%\\.aws\\credentials
中。 對於 Mac/Linux 使用者,認證應該進入~/.aws/credentials)
。 此範例顯示了典型憑證檔案的內容。[default] aws_access_key_id = {access_key_id} aws_secret_access_key = {secret_access_key}
-
在IBM Cloud平台上使用 CLI 命令建立的應用程式的網頁中,登入IBM Cloud平台,將所需的憑證定義為每個開發最佳實踐的環境變量,然後選擇您的應用程式
webapplication
。 在選項卡中,按一下運行時。 -
在“運行時”視窗中,按一下頁面開頭的“環境變數”,然後捲動到“使用者定義”部分,您可以在其中新增變數。
-
新增兩個變數:一個變數的值為
access_key_id
的值,使用AWS_ACCESS_KEY_ID
作為金鑰名稱,另一個變數的值為您的秘密存取金鑰的值,名稱為AWS_SECRET_ACCESS_KEY
。 在 Object Storage Platform 上執行時,這些變數及其個別值是應用程式用來鑑別 IBM Cloud 實例的內容(請參閱圖 6)。 當您完成項目時,請按一下「儲存」,IBM Cloud Platform 將會自動重新啟動應用程式。為您的應用程式
接下來,在服務實例的「Object Storage 入口網站」上,新增儲存區以包含影像。 此場景使用名為 web-images
的儲存桶。
自訂 Node.js IBM Cloud Object Storage Image Gallery Web 應用程式
因為此範例使用 MVC 架構,所以調整專案內的目錄結構來反映此架構是一種便利方式,也是最佳作法。 目錄結構有一個包含 EJS 視圖模板的views 目錄、一個包含快速路由的routes 目錄以及一個用於放置控制器邏輯的 controllers
目錄。 將這些項目放在名為 src
的父源目錄下(請參閱圖 7)。

提示: 您先前複製的儲存庫包含名為 COS-WebGalleryEnd
的目錄。 在遵循後續步驟時,使用偏好的編輯器來檢視已完成應用程式的原始碼可能十分有用。 這是您完成本教學後提交並部署到IBM Cloud平台的 webapplication
版本。
設計應用程式
這是使用者應該能夠使用簡單 Image Gallery Web 應用程式執行的兩個主要作業:
- 將影像從 Web 瀏覽器上傳至 Object Storage 儲存區。
- 在 Web 瀏覽器中檢視 Object Storage 儲存區中的影像。
後續步驟著重在如何完成這兩個示範功能,而不是建置完整開發的正式作業等級應用程式。 部署本指導教學並讓它公開並執行,表示任何找到此應用程式的人都可以執行相同的動作:將檔案上傳至 IBM Cloud Object Storage 儲存區,並檢視其瀏覽器中已存在的所有 JPEG 影像。
開發應用程式
在 package.json
檔案的腳本物件內,您可以看到「start」是如何定義的。 IBM Cloud Platform 使用此檔案來告知節點在每次應用程式啟動時執行 app.js。 另外,在本地測試應用程式時使用它。 查看主應用程式文件,該文件名稱為 app.js
。 這是您在使用 npm start
命令(或 nodemon
)啟動應用程式時告訴Node.js首先處理的程式碼。
{
"scripts": {
"start": "node app.js"
}
}
我們的 app.js
檔案使用節點來載入開始使用所需的模組。 Express 架構會將應用程式建立為單態,簡稱為 app
。 此範例結束(暫時省略大部分程式碼)告訴應用程式偵聽指派的連接埠和環境屬性,預設為 3000。 當成功啟動時,它會在控制台上列印一條帶有伺服器 URL 的訊息。
var express = require('express');
var cfenv = require('cfenv');
var bodyParser = require('body-parser');
var app = express();
//...
// start server on the specified port and binding host
var port = process.env.PORT || 3000;
app.listen(port, function() {
console.log("To view your app, open this link in your browser: http://localhost:" + port);
});
//...
讓我們看看如何定義路徑和視圖。 第一行程式碼告訴 Express 框架使用公共目錄來提供靜態文件,其中包括您使用的任何靜態圖像和樣式表。 接下來的幾行告訴應用程式在 src/views
目錄中哪裡可以找到視圖的模板,並將視圖引擎設定為 EJS。 此外,該框架使用 body-parser 中間件將傳入請求資料以 JSON 形式公開給應用程式。 在範例的最後幾行中,express 應用程式透過呈現 index.ejs
視圖範本來回應所有傳入應用程式
URL 的 GET 請求。
//...
// serve the files out of ./public as your main files
app.use(express.static('public'));
app.set('views', './src/views');
app.set('view engine', 'ejs');
app.use(bodyParser.json());
var title = 'COS Image Gallery Web Application';
// Serve index.ejs
app.get('/', function (req, res) {
res.render('index', {status: '', title: title});
});
//...
下圖顯示呈現並傳送至瀏覽器的索引視圖範本。 如果您是使用,nodemon
您可能已注意到您的瀏覽器在儲存變更時已重新整理。

我們的視圖範本會在 <head>...</head>
; 標籤之間共用 HTML 程式碼,因此您將它放在個別的併入範本中。 此範本 ( head-inc.ejs
) 包含第 1 行頁面標題的 scriptlet( JavaScript變數的綁定)。 title
變數在 app.js
中設置,並在下面的行中作為視圖模板的資料傳入。 否則,您只是使用一些
CDN 位址來拉入 Bootstrap CSS
、Bootstrap JavaScript
和 JQuery
。 最後,從 pubic/stylesheets
目錄新增自訂靜態 styles.css
檔案。
<title><%=title%></title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.1.1.min.js"
integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
crossorigin="anonymous">
</script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous">
</script>
<link rel="stylesheet" href="stylesheets/style.css">
索引視圖的主體包含引導程式樣式的導覽選項卡,以及基本佈局中的上傳表單,該佈局由引導程式中包含的 CSS 樣式提供。
請考慮您的應用程式的這兩個規範:
-
在第 24 行將表單方法設為
POST
,並將表單資料編碼類型設為 multipart/form-data。 對於表單操作,將表單中的資料傳送到應用程式的應用程式路由「/」。 稍後,在路由器邏輯中進行額外的工作以處理對該路由的POST
請求。 -
向使用者顯示有關嘗試上傳文件的狀態的回饋。 此回饋透過名為「status」的變數傳遞到您的視圖,並顯示在上傳表單之後。
<!DOCTYPE html>
<html>
<head>
<%- include('head-inc'); %>
</head>
<body>
<ul class="nav nav-tabs">
<li role="presentation" class="active"><a href="/">Home</a></li>
<li role="presentation"><a href="/gallery">Gallery</a></li>
</ul>
<div class="container">
<h2>Upload Image to IBM Cloud Object Storage</h2>
<div class="row">
<div class="col-md-12">
<div class="container" style="margin-top: 20px;">
<div class="row">
<div class="col-lg-8 col-md-8 well">
<p class="wellText">Upload your JPG image file here</p>
<form method="post" enctype="multipart/form-data" action="/">
<p><input class="wellText" type="file" size="100px" name="img-file" /></p>
<br/>
<p><input class="btn btn-danger" type="submit" value="Upload" /></p>
</form>
<br/>
<span class="notice"><%=status%></span>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
讓我們花點時間回到 app.js
。 此範例設定 Express 路由來處理向您的應用程式發出的額外請求。 這些路由方法的程式碼位於專案的 ./src/routes
目錄下的兩個檔案:
-
imageUploadRoutes.js
:此檔案處理使用者選擇圖像並點擊上傳時發生的情況。 -
galleryRoutes.js
:當使用者按一下「圖庫」標籤要求imageGallery
視圖時,此檔案處理請求。
//...
var imageUploadRoutes = require('./src/routes/imageUploadRoutes')(title);
var galleryRouter = require('./src/routes/galleryRoutes')(title);
app.use('/gallery', galleryRouter);
app.use('/', imageUploadRoutes);
//...
影像上傳
請參閱 imageUploadRoutes.js
中的程式碼。 您必須建立一個新的快速路由器實例,並在開始時將其命名為 imageUploadRoutes
。 稍後,建立一個傳回 imageUploadRoutes
的函數,並將其指派給名為 router
變數。 完成後,必須將該函數匯出為模組,以便框架和 app.js
中的主程式碼可以存取它。
將路由邏輯與上傳邏輯分開需要一個名為 galleryController.js
的控制器檔案。 由於該邏輯專用於處理傳入請求並提供適當的回應,因此將該邏輯放入該函數中並將其保存在 ./src/controllers
目錄中。
Express 框架中的 Router 實例是您的 imageUploadRoutes
設計的地方,用於在使用 HTTP POST
方法時路由根應用程式路由(“/”)的請求。 在 imageUploadRoutes
的 post
方法內,使用 multer
和 multer-s3
模組中的中間件,該模組由 galleryController
公開為 upload
。 中間件從上傳表單 POST
取得資料和文件,對其進行處理,然後執行回呼函數。 在回調函數中,檢查您是否獲得了 HTTP 狀態代碼 200
,並且您的請求對像中至少有一個檔案要上傳。 根據這些條件,在 status
變數中設定回饋,並使用新狀態呈現索引視圖範本。
var express = require('express');
var imageUploadRoutes = express.Router();
var status = '';
var router = function(title) {
var galleryController =
require('../controllers/galleryController')(title);
imageUploadRoutes.route('/')
.post(
galleryController.upload.array('img-file', 1), function (req, res, next) {
if (res.statusCode === 200 && req.files.length > 0) {
status = 'uploaded file successfully';
}
else {
status = 'upload failed';
}
res.render('index', {status: status, title: title});
});
return imageUploadRoutes;
};
module.exports = router;
相比之下,galleryRouter
的程式碼就是一個簡單的模型。 遵循與 imageUploadRouter
相同的模式,並在函數的第一行要求 galleryController
,然後設定您的路線。 主要區別在於,您路由 HTTP GET
請求而不是 POST
,並發送 getGalleryImages
回應中的所有輸出,該輸出由範例最後一行的
galleryController
公開。
var express = require('express');
var galleryRouter = express.Router();
var router = function(title) {
var galleryController =
require('../controllers/galleryController')(title);
galleryRouter.route('/')
.get(galleryController.getGalleryImages);
return galleryRouter;
};
module.exports = router;
接下來,請查看展示區的控制器。
請注意如何設定 multer
上傳,這會截斷您目前忽略的部分程式碼。 您需要模組 ibm-cos-sdk
、multer
和 multer-s3
。 此程式碼顯示如何配置指向 Object Storage 伺服器端點的 S3 物件。 為了簡單起見,您靜態設定端點位址、區域和儲存桶等值,但可以輕鬆地從環境變數或 JSON 設定檔中引用它們。
透過建立以 storage
作為其唯一內容的新 multer
實例,在 imageUploadRouter
中定義 upload
。 此屬性告訴 multer
將檔案從 multipart/form-data
傳送到哪裡。 由於IBM Cloud平台使用S3 API 的實現,因此將儲存設定為 s3-multer
物件。 此 s3-multer
物件包含指派給 s3
物件的 s3
內容。 還有一個指派給 myBucket
變數的 bucket
內容,該變數會獲指派值 web-images
。 s3-multer
物件現在擁有在從上傳表單接收資料時將檔案上傳到您的Object Storage儲存桶所需的所有資料。
已上傳物件的名稱 (或索引鍵) 是原始檔名。
請使用時間戳記作為檔名的一部分,以維護檔名唯一性。
var galleryController = function(title) {
var aws = require('ibm-cos-sdk');
var multer = require('multer');
var multerS3 = require('multer-s3');
var ep = new aws.Endpoint('s3.us-south.cloud-object-storage.appdomain.cloud');
var s3 = new aws.S3({endpoint: ep, region: 'us-south-1'});
var myBucket = 'web-images';
var upload = multer({
storage: multerS3({
s3: s3,
bucket: myBucket,
acl: 'public-read',
metadata: function (req, file, cb) {
cb(null, {fieldName: file.fieldname});
},
key: function (req, file, cb) {
console.log(file);
cb(null, file.originalname);
}
})
});
var getGalleryImages = function (req, res) { /* ... shown below ... */ };
return {
getGalleryImages: getGalleryImages,
upload: upload
};
};
module.exports = galleryController;
若為本端測試,有用的作業是將檔案物件列印至主控台 console.log(file)
。 對上傳表單執行本機測試並顯示檔案的控制台日誌的輸出。
{ fieldname: 'img-file',
originalname: 'Chrysanthemum.jpg',
encoding: '7bit',
mimetype: 'image/jpeg' }
您回呼的意見在測試時宣告應用程式已「順利上傳檔案」。

影像擷取及顯示
請記住,在 app.js
中,代碼行 app.use('/gallery', galleryRouter);
告訴 Express 框架在請求 /gallery
路由時使用該路由器。 該路由器使用 galleryController.js
,定義 getGalleryImages
函數,您先前已看到其簽章。 使用您為圖像上傳函數設定的相同 s3
對象,呼叫名為 listObjectsV2
的函數。 此函數傳回定義儲存桶中每個物件的索引資料。 要在 HTML 中顯示圖像,您需要為 web-images
儲存桶中的每個 JPEG 圖像提供一個圖像 URL,以便在視圖模板中顯示。 包含 listObjectsV2
傳回的資料物件的閉包包含有關儲存桶中每個物件的元資料。
程式碼循環遍歷 bucketContents
搜尋以“.jpg”結尾的任何物件鍵,並建立一個參數以傳遞給S3 getSignedUrl
函數。 當您提供物件的儲存桶名稱和金鑰時,此函數會傳回任何物件的簽章 URL。 在回呼函數中,將每個 URL 保存在陣列中,並將其作為名為 imageUrls
屬性的值傳遞給HTTP Server回應方法 res.render
。
//...
var getGalleryImages = function (req, res) {
var params = {Bucket: myBucket};
var imageUrlList = [];
s3.listObjectsV2(params, function (err, data) {
if (data) {
var bucketContents = data.Contents;
for (var i = 0; i < bucketContents.length; i++) {
if (bucketContents[i].Key.search(/.jpg/i) > -1) {
var urlParams = {Bucket: myBucket, Key: bucketContents[i].Key};
s3.getSignedUrl('getObject', urlParams, function (err, url) {
imageUrlList.push(url);
});
}
}
}
res.render('galleryView', {
title: title,
imageUrls: imageUrlList
});
});
};
//...
最後一個程式碼範例顯示 galleryView
範本的主體,以及顯示影像所需的程式碼。 從 res.render()
方法取得 imageUrls
陣列,並反覆運算一對巢狀 <div>...</div>
標籤。 每一個都會在要求 /gallery
路徑時針對映像檔傳送 GET
要求。
<!DOCTYPE html>
<html>
<head>
<%- include('head-inc'); %>
</head>
<body>
<ul class="nav nav-tabs">
<li role="presentation"><a href="/">Home</a></li>
<li role="presentation" class="active"><a href="/gallery">Gallery</a></li>
</ul>
<div class="container">
<h2>IBM COS Image Gallery</h2>
<div class="row">
<% for (var i=0; i < imageUrls.length; i++) { %>
<div class="col-md-4">
<div class="thumbnail">
<img src="<%=imageUrls[i]%>" alt="Lights" style="width:100%">
</div>
</div>
<% } %>
</div>
</div>
</body>
</html>
從 http://localhost:3000/gallery
本端測試應用程式,並查看您的影像。

確定至 Git
現在應用程式的基本功能已經開始運作,請將程式碼提交到本機儲存庫,然後將其推送到GitHub。 使用GitHub Desktop,按一下 Changes(請參閱圖 11),在 Summary 欄位中鍵入變更摘要,然後按一下 Commit to Local-dev。

當您按一下 同步時,您的確定會傳送至遠端 local-dev
分支。 此動作會在 Delivery Pipeline中啟動「建置及部署階段」。

後續步驟
您從開始到結束,並使用 IBM Cloud Platform 來建置基本 Web 應用程式影像展示區。 您在此基本簡介中涵蓋的每一個概念都可以在 IBM Cloud Object Storage中進一步探索。
祝您一切順利!