取得領先
VMware 提供培訓和認證,以加速您的進步。
瞭解更多在之前的文章中,我介紹瞭如何使用自定義 ANT 任務從 Spring 產品組合中基於 ANT 的專案上傳每日快照。 在這篇文章中,我將介紹如何使用 Amazon S3 為每個專案的快照生成頁面,並允許使用者下載快照。
正如我在上一篇文章中提到的,S3 主要用作 RESTful 服務。 這意味著雖然我使用 Java 進行上傳部分,但我可以自由使用其他語言進行下載部分。 在這種情況下,我選擇使用 PHP,因為它已經在我正在使用的伺服器上可用,並且阻力最小。
這項工作分為兩個部分。 首先,我需要查詢 Amazon S3 服務以獲取給定 Spring 專案的快照列表。 為此,您需要建立一個帶有 prefix 引數的 REST 查詢
http://s3.amazonaws.com/static.springframework.org/?prefix=$prefix
現在您已經瞭解了基本的查詢方式,我想回到前面的示例並指出上傳定義的一些重要部分
<aws:s3 accessKey="${s3.accessKey}" secretKey="${s3.secretKey}">
<upload bucketName="static.springframework.org"
file="${target.release.dir}/${release-with-dependencies.zip}"
toFile="SPR/spring-framework-${spring-version}-with-dependencies-${tstamp}-${build.number}.zip"
publicRead="true"/>
<upload bucketName="static.springframework.org"
file="${target.release.dir}/${release.zip}"
toFile="SPR/spring-framework-${spring-version}-${tstamp}-${build.number}.zip"
publicRead="true"/>
</aws:s3>
您首先會注意到,對於 Spring 工件,我選擇以 SPR 為字首。 檔名稱本質上是自由形式的,因此使用斜槓可以建立虛擬目錄結構來查詢。 如果您檢視 Spring Web Flow 的構建,您會看到它的工件以 SWF 為字首,Spring LDAP 的工件以 LDAP 為字首,Spring Modules 的工件以 MOD 為字首。 因此,現在透過自定義查詢引數,我們可以專門選擇一個專案。
http://s3.amazonaws.com/static.springframework.org/?prefix=SPR
http://s3.amazonaws.com/static.springframework.org/?prefix=SWF
http://s3.amazonaws.com/static.springframework.org/?prefix=LDAP
http://s3.amazonaws.com/static.springframework.org/?prefix=MOD
需要注意的第二件事是 publicRead=true 宣告。 預設情況下,S3 不允許任何人檢視或從您的儲存桶下載。 您可以使用您的金鑰和訪問金鑰來建立一個令牌來允許下載,從而授予他們許可權。 但對於這項工作,我認為這是不必要的。 快照是公開可訪問的,所以我放寬了安全性,允許在沒有令牌的情況下下載它們。
現在您可以呼叫 S3 REST 服務並獲得儲存桶中專案的正確過濾列表,但響應是原始 XML。 即使我是一名 Spring 開發人員,在 Web 瀏覽器中檢視原始 XML 也不會讓我感到興奮。 ;) 因此,該過程的下一步是將 XML 轉換為有用的 HTML 頁面。 我當時有兩個選擇。 我可以在伺服器上執行轉換以生成 HTML,然後將其返回給使用者,或者我可以將 XML 與 XSLT 檔案一起返回給使用者,並讓使用者的瀏覽器為我進行轉換。 現在我會誠實地說,後者減輕了伺服器的負擔,實際上允許使用者的瀏覽器快取轉換以提高效能。 但現實情況是,我只是無法訪問 XSLT PHP 庫,因此如果我想進行伺服器端轉換,我也無法這樣做。 我意識到一些舊瀏覽器在這種設定下會遇到問題,但我們會在到達時再解決這個問題。
所以我需要獲取返回的 XML
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>static.springframework.org</Name>
<Prefix>SPR</Prefix>
<Marker/>
<MaxKeys>1000</MaxKeys>
<IsTruncated>false</IsTruncated>
<Contents>
<Key>SPR/spring-framework-2.0.5-20070411-50.zip</Key>
<LastModified>2007-04-11T13:27:34.000Z</LastModified>
<ETag>"1ab20ad18ca0edb4a360279f27409d54"</ETag>
<Size>10725241</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
<Contents>
<Key>SPR/spring-framework-2.0.5-20070411-51.zip</Key>
<LastModified>2007-04-12T01:25:58.000Z</LastModified>
<ETag>"de2e5833ae8fe4cc06987935bea06e57"</ETag>
<Size>10727049</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
<Contents>
<Key>SPR/spring-framework-2.0.5-20070412-52.zip</Key>
<LastModified>2007-04-13T01:22:23.000Z</LastModified>
<ETag>"414b947226fc4e08bd118e0f16a6be67"</ETag>
<Size>10736732</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
...
並將其轉換為 HTML
從服務返回的大部分內容對此工作沒有用處,因此 XSLT 變得非常簡單
<xsl:template match="/">
<head>
<style type="text/css" media="all">@import "./snapshot-download.css";</style>
</head>
<body>
<xsl:apply-templates select="s3:ListBucketResult"/>
</body>
</xsl:template>
<xsl:template match="s3:ListBucketResult">
<xsl:variable name="bucket-name" select="s3:Name"/>
<table>
<tr>
<th class="name"><xsl:value-of select="s3:Prefix"/> Project Snapshots</th>
<th class="size">Size</th>
</tr>
<xsl:for-each select="s3:Contents">
<tr>
<td class="name">
<a class="name" href="http://s3.amazonaws.com/{$bucket-name}/{s3:Key}">
<xsl:value-of select="substring-after(s3:Key, '/')"/>
</a>
</td>
<td class="size"><xsl:value-of select="format-number(s3:Size div 1048576, '###,###.0')"/> MB</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
轉換以一些 HTML 宣告開始,然後迭代儲存桶的每個專案。 然後,它使用物件識別符號在 S3 伺服器上建立指向該檔案的連結。 就是這樣。 PHP 頁面呼叫 S3 獲取 XML,然後將其與 XSLT 宣告一起傳遞給使用者的瀏覽器
<?php
$prefix = $HTTP_GET_VARS["project"];
$url = "http://s3.amazonaws.com/static.springframework.org/?prefix=$prefix";
$xml = file_get_contents($url);
header('Content-Type: text/xml; charset=UTF-8');
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<?xml-stylesheet type="text/xsl" href="./snapshot-download.xsl"?>';
echo substr($xml, 39);
?>
為每個專案新增一些自定義的請求引數,您將獲得每個專案的單獨下載頁面
這完成了我對 Amazon S3 服務的探索。我現在可以根據經驗說,如果您有大量資料並且需要大量頻寬,那麼沒有多少地方能為您提供更好的價格。 憑藉 RESTful 介面,它足夠靈活,可以與您喜歡的語言一起使用。 謝謝你邀請我,我現在可以回答任何問題。 :)