領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多在上一篇文章中,我描述了我們如何使用自定義 ANT 任務從 Spring 產品組合中基於 ANT 的專案上傳每日快照。在這篇文章中,我將描述我們如何使用 Amazon S3 為每個專案的快照生成頁面並允許使用者下載快照。
正如我在上一篇文章中提到的,S3 主要用作 RESTful 服務。這意味著,雖然我在上傳部分使用了 Java,但在下載部分,我可以自由使用其他語言。在這種情況下,我選擇了 PHP,因為它已經存在於我正在使用的伺服器上,並且是阻力最小的路徑。
這項工作有兩個部分。第一部分是我需要查詢 Amazon S3 服務,以獲取給定 Spring 專案的快照列表。要做到這一點,您需要建立一個帶有字首引數的 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 開發者,在瀏覽器中檢視原始 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 頁面為 XML 呼叫 S3,然後將其連同 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 介面,它足夠靈活,可以與您喜歡的任何語言一起使用。感謝您的聆聽,我現在可以回答任何問題。:)