2010-05-28 103 views
3

我想要創建一個腳本來檢查URL,並在遠程文件的「Last-Modified」標題發生變化時執行操作(下載+解壓縮)。我想過用curl來獲取頭文件,但是我必須將它存儲在每個文件的某個位置並執行日期比較。如何在遠程(Http)文件更改時執行操作?

有沒有人有使用(主要是)標準的unix工具有不同的想法?

感謝

回答

8

一個可能的解決辦法是定期運行在客戶盒這個算法。

  1. 創建一個HTTP請求,指示If-Modified-Since標頭等於您的本地文件的日期。如果文件不存在,請不要包含此標題;
  2. 如果服務器自有效負載中的If-Modified-Since標頭以來發生更改,或者發送304 Not Modified HTTP狀態,則服務器將向您發送文件。
  3. 如果您收到200 OK HTTP狀態,只需從HTTP正文獲取有效內容並解壓縮該文件。
  4. 如果您在另一方面收到304 Not Modified,則表明您的文件是最新的。
  5. 使用Last-Modified標題觸摸您的本地文件。這樣您將與服務器日期時間同步。

另一種方法是服務器在更改文件時推送通知(例如廣播包)。當收到通知時,客戶端將執行上述算法。這意味着代碼將駐留在偵聽文件系統更改的HTTP服務器中,然後將它們廣播給感興趣的各方。

也許這信息爲curlcommand一定的重要性:

時間等條件

HTTP允許客戶爲其指定 請求該文檔的時間 條件。它是If-Modified-Since或者If-Unmodified-Since。捲曲讓你 用-z/- time-cond 標誌指定它們。

例如,您可以輕鬆地進行 下載,只有在 遠程文件比本地 副本更新時才能執行下載。它會作出這樣的:

捲曲-z local.html http://remote.server.com/remote.html

或者只在 本地文件比遠程 一個較新的,你可以下載一個文件。 「 - 」在前面加上日期 字符串以做到這一點,如:

捲曲-z -local.html http://remote.server.com/remote.html

你可以指定一個「自由文本」日期 條件。告訴捲曲只下載 該文件,如果有人因爲 昨天更新:

捲曲-z昨天 http://remote.server.com/remote.html

然後捲曲將接受廣泛的 日期格式。你總是讓日期 檢查其他方式 用短劃線' - '加上,並用短劃線' - '作爲前綴。

綜上所述,你將需要:

+0

不錯:)'curl -z'。太糟糕了,http服務器似乎忽略了if-modified-since :(但是可能curl會修復它。我試試:) – ZeissS 2010-05-28 12:03:40

+1

你有使用工具的'If-Modified-Since'的格式嗎?參見[這裏](http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#if-modified-since)。 格式如[RFC850](http://www.w3.org/Protocols/rfc850/rfc850.html#z10)但必須使用GMT。 無論如何,'curl-z'應該避免在如何獲得'If-Modified-Since'標頭右格式時遇到的問題。 – 2010-05-28 12:06:25

+0

是的,沒錯,但該死的oracle服務器似乎忽略了它。它甚至在請求HEAD時發送內容;)但是沒關係,它現在使用'curl -z'工作 – ZeissS 2010-05-28 12:30:20

1

就是Java適合你的情況?我在使用Apache HTTPcore庫的作業之一中做了類似的事情,在將它發送到服務器之前,如果您的響應的狀態碼是您的,則需要在您的HTTP請求中添加頭部「If-Modified-Since」從服務器接收不是304,那麼你知道該文件自你檢查的時間值以來已經改變。

相關問題