本文以PHP語言為例,講解在服務端通過PHP程式碼完成簽名,並且設定上傳回調,然後通過表單直傳資料到OSS。
前提條件
Web伺服器已部署。
Web伺服器對應的網域名稱可通過公網訪問。
Web伺服器能夠解析PHP(執行命令
php -v
進行查看)。說明PHP需要為PHP 5及以上版本。
PC端瀏覽器支援JavaScript。
步驟1:配置Web伺服器
本文以Ubuntu16.04為例介紹使用不同Web伺服器時的環境配置,請根據實際選擇。
當使用Apache作為Web伺服器時,請進行如下環境配置,此處以Apache2.4.18為例說明。
Web伺服器外網IP地址為
192.0.2.11
。您可以在設定檔/etc/apache2/apache2.conf
中增加ServerName 192.0.2.11
來進行修改。Web伺服器的監聽連接埠為
8080
。您可以在設定檔/etc/apache2/ports.conf
中進行修改相關內容Listen 8080
。確保Apache能夠解析PHP檔案:
sudo apt-get install libapache2-mod-php5
(其他平台請根據實際情況進行安裝配置)。
您可以根據自己的實際環境修改IP地址和監聽連接埠。更新配置後,需要重啟Apache伺服器,重啟命令為/etc/init.d/apache2 restart。
當使用nginx作為Web伺服器時,請進行如下環境配置,此處以nginx1.19.7為例說明。
Web伺服器外網IP地址為
192.0.2.11
,監聽連接埠為8080
。您可以在設定檔/etc/nginx/nginx.conf
中修改外網IP地址和連接埠。設定檔樣本如下:server { listen 8080; server_name 192.0.2.11; root /var/www/html; index index.html index.php; location ~* \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
您可以根據自己的實際環境修改IP地址和監聽連接埠。更新配置後,需要重啟nginx伺服器。
步驟2:配置應用伺服器
下載應用伺服器源碼(PHP版本)。
將應用伺服器源碼解壓到應用伺服器的相應目錄。本文樣本中需要部署到Ubuntu16.04的/var/www/html/aliyun-oss-appserver-php目錄下。
PC端瀏覽器中訪問應用伺服器URL
http://192.0.2.11:8080/aliyun-oss-appserver-php/index.html
。如果使用Apache作為Web伺服器,請開啟Apache捕獲HTTP頭部Authorization欄位的功能。如果使用nginx作為Web伺服器,請跳過此步驟。
您的應用伺服器收到的回調請求有可能沒有Authotization頭,這是因為有些Web應用伺服器會將Authorization頭自行解析掉。例如Apache2,需要設定成不解析頭部。
開啟Apache2設定檔/etc/apache2/apache2.conf,找到如下片段進行相應修改。
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
在/var/www/html/aliyun-oss-appserver-php目錄下,建立一個.htaccess檔案,填寫如下內容。
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] </IfModule>
其他Web伺服器或其他Apache版本,請根據實際情況進行配置。
修改應用伺服器配置。
在/var/www/html/aliyun-oss-appserver-php/php目錄下開啟檔案get.php, 修改如下程式碼片段。
$id= '<yourAccessKeyId>'; // 填寫您的AccessKey ID。 $key= '<yourAccessKeySecret>'; // 填寫您的AccessKey Secret。 // $host的格式為https://bucketname.endpoint,請替換為您的真實資訊。 $host = 'https://bucket-name.oss-cn-hangzhou.aliyuncs.com'; // $callbackUrl為上傳回調伺服器的URL,請將以下IP和Port配置為您自己的真實URL資訊。 $callbackUrl = 'http://192.0.2.11:8080/aliyun-oss-appserver-php/php/callback.php'; $dir = 'user-dir-prefix/'; // 上傳檔案時指定的首碼。
配置項
是否必填
樣本值
描述
id
是
LTAn*********************
阿里雲帳號或者RAM使用者的AccessKey ID和AccessKey Secret。具體操作,請參見擷取AccessKey。
key
是
zbnK**************************
host
是
https://bucket-name.oss-cn-hangzhou.aliyuncs.com
訪問地址,格式為
https://BucketName.Endpoint
。關於Endpoint的更多資訊,請參見訪問網域名稱和資料中心。callbackUrl
是
http://192.0.2.11:8080/aliyun-oss-appserver-php/php/callback.php
上傳回調URL,即回調伺服器位址,用於處理應用伺服器與OSS之間的通訊。OSS會在檔案上傳完成後,把檔案上傳資訊通過此回調URL發送給應用伺服器。
dir
否
exampledir/
上傳到OSS的檔案首碼。請根據實際需要配置此項。
如果不需要設定檔案首碼,設定為空白即可。
步驟3:配置用戶端
在應用伺服器的/var/www/html/aliyun-oss-appserver-php目錄下修改檔案upload.js。
對於PHP版本的應用伺服器源碼,一般不需要修改檔案upload.js內容,因為相對路徑也是可以正常工作的。如果確實需要修改,請找到此段程式碼片段serverUrl ='./php/get.php'
,將serverUrl
改成伺服器部署的地址,用於處理瀏覽器和應用伺服器之間的通訊。例如本樣本中可以修改為serverUrl ='http://192.0.2.11:8080/aliyun-oss-appserver-php/php/get.php'
。
步驟4:修改CORS
用戶端進行表單直傳到OSS時,會從瀏覽器向OSS發送帶有Origin
的請求訊息。OSS對帶有Origin
頭的請求訊息會進行跨域規則(CORS)的驗證。因此需要為Bucket設定跨域規則以支援Post方法。
步驟5:體驗上傳回調
在PC端的Web瀏覽器中輸入http://192.0.2.11:8080/aliyun-oss-appserver-php/index.html。
重要index.html檔案不保證相容IE 10以下版本瀏覽器,若使用IE 10以下版本瀏覽器出現問題時,您需要自行調試。
單擊選擇檔案,選擇指定類型的檔案後,單擊開始上傳。
上傳成功後,顯示回調伺服器返回的內容。
應用伺服器核心代碼解析
應用伺服器源碼包含了簽名直傳服務和上傳回調服務兩個功能。
簽名直傳服務
簽名直傳服務響應用戶端發送給應用伺服器的GET訊息,代碼檔案是aliyun-oss-appserver-php/php/get.php。程式碼片段如下:
$response = array(); $response['accessid'] = $id; $response['host'] = $host; $response['policy'] = $base64_policy; $response['signature'] = $signature; $response['expire'] = $end; $response['callback'] = $base64_callback_body; $response['dir'] = $dir;
上傳回調服務
上傳回調服務響應OSS發送給應用伺服器的POST訊息,代碼檔案是aliyun-oss-appserver-php/php/callback.php。
程式碼片段如下:
// 6.驗證簽名 $ok = openssl_verify($authStr, $authorization, $pubKey, OPENSSL_ALGO_MD5); if ($ok == 1) { header("Content-Type: application/json"); $data = array("Status"=>"Ok"); echo json_encode($data); }
更多資訊,請參見API參考中的Callback。