当远程(Http)文件更改时如何执行操作?

5
我想创建一个脚本,检查URL并在远程文件的“Last-Modified”头更改时执行操作(下载+解压缩)。我考虑使用curl获取头信息,但是我需要为每个文件存储它,并进行日期比较。有没有人有不同的想法,使用(主要)标准Unix工具?谢谢。
2个回答

8
一种可能的解决方案是定期在客户端上运行此算法。
  1. 创建一个HTTP请求,其中包含“如果修改自”标头,该标头等于本地文件的日期。如果文件尚不存在,则不要包括此标题;
  2. 如果服务器在有效负载中更改了文件,则发送文件;否则发送“304未修改”的HTTP状态。
  3. 如果收到“200 OK” HTTP状态,请从HTTP正文获取有效负载并解压缩文件。
  4. 如果另一方面收到“304未修改”,则知道您的文件已经是最新的。
  5. 使用“最后修改”标头触摸本地文件。这样,您将与服务器日期时间同步。
另一种方法是让服务器在文件更改时推送通知(例如广播包)。当接收到通知时,客户端将执行上述算法。这意味着代码需要存在于HTTP服务器中,以便监听文件系统更改,然后将其广播给感兴趣的各方。

也许对于 curl 命令 的这些信息很重要:

时间条件

HTTP允许客户端为所请求的文档指定时间条件。这可以使用If-Modified-Since或If-Unmodified-Since完成。您可以使用-z / --time-cond标志在Curl中指定它们。

例如,如果远程文件比本地副本更新,您可以轻松地进行下载。它将被执行如下:

curl -z local.html http://remote.server.com/remote.html

或者,仅当本地文件较新时才下载文件。只需要在日期字符串前面添加'-',如:

curl -z -local.html http://remote.server.com/remote.html

您可以指定“自由文本”日期作为条件。告诉Curl仅在昨天之后更新文件时才下载文件:

curl -z yesterday http://remote.server.com/remote.html

Curl随后将接受各种日期格式。通过在日期前面添加一个破折号“-”来始终使日期检查相反。

简而言之,您需要:

不错 :) curl -z。可惜 HTTP 服务器似乎忽略了 if-modified-since :( 不过也许 curl 会修复它。我会尝试的 :) - ZeissS
1
你使用的工具是否正确设置了 If-Modified-Since 的格式?请参考这里,格式应该遵循RFC850,但必须使用GMT时间。无论如何,使用 curl - z 命令可以避免为 If-Modified-Since 头部正确设置格式而头疼。 - Jorge Ferreira
是的,没错,但该死的oracle服务器似乎忽视它。甚至在使用HEAD请求时也会发送内容;)但是没关系,现在使用curl -z可以解决问题了。 - ZeissS

1

Java在你的情况下是否适用?我在我的一项作业中使用了Apache HTTPcore库进行类似的操作,你需要在将HTTP请求发送到服务器之前向其添加头部"If-Modified-Since",如果从服务器接收到的响应状态码不是304,则说明文件自检时间以来已更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接