用HTTP Head 试探网络上的一个文件存在,但是不去下载?

本文介绍了一种不实际下载文件而仅检查其是否存在的方法。通过使用Java的HttpURLConnection类发送HTTP HEAD请求,可以快速判断远程资源是否存在,适用于大文件场景。

在我们的应用中,有的时候会试探一个文件是否存在,一个图片是否存在,但是不去真正的去下载,特别是文件比较大的时候。那么这个时候,我们的代码应该如何写呢?下面是基于JDK 自身API的一种实现方式:使用HTTP的HEAD方法。

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.junit.Test;

public class URLTest {

	@Test
	public void testURL(){
		String urlstr="https://www.broward.org/EasyPay/Learning/Documents/TimecardsSchedulesSupervUseGuide.pdf";
		try {
			long begin=System.currentTimeMillis();
			URL url=new URL(urlstr);
			HttpURLConnection httpURLConnection=(HttpURLConnection)url.openConnection();
			httpURLConnection.setRequestMethod("HEAD");
			int responsecode=httpURLConnection.getResponseCode();
			System.out.println("-----"+responsecode);
			long end=System.currentTimeMillis();
			System.out.println("--Time Consumed---"+(end-begin));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


如果Fiddler 4模拟,其报文如下:



<think>我们被要求使用curl检查远程文件是否存在下载。根据之前的引用和知识,我们可以使用HTTP HEAD方法,因为HEAD方法只请求头部信息而下载文件内容。curl命令支持使用`-I`或`--head`选项来发送HEAD请求。 但是,注意:有些服务器可能支持HEAD方法,或者对于某些资源(如动态生成的)HEAD方法可能返回与GET同的结果。因此,另一种方法是使用GET请求但只获取头部(使用`-I`选项),或者使用`-o /dev/null`丢弃内容,同时结合`-w`选项检查HTTP状态码。 推荐方法: 1. 使用`-I`选项(发送HEAD请求)并检查HTTP状态码。 2. 或者使用`-s -o /dev/null -w "%{http_code}"`来获取状态码而下载内容。 具体步骤: - 使用HEAD请求(更高效,因为返回内容): ```bash curl -s -I -o /dev/null -w "%{http_code}" https://example.com/file.zip ``` 如果返回200,则表示文件存在;404表示存在;其他状态码需要具体分析(如301/302重定向等)。 - 如果服务器支持HEAD,则使用GET请求但保存内容: ```bash curl -s -o /dev/null -w "%{http_code}" https://example.com/file.zip ``` 注意:为了避免将内容输出到终端,我们使用`-o /dev/null`将内容丢弃。 因此,我们可以写一个脚本检查状态码: ```bash status_code=$(curl -s -o /dev/null -w "%{http_code}" https://example.com/file) if [ "$status_code" -eq 200 ]; then echo "文件存在" else echo "文件存在或服务器错误(状态码:$status_code)" fi ``` 如果希望使用HEAD方法,只需在curl命令中加入`-I`(注意:使用HEAD方法时,服务器可能会返回相同的状态码,但通常对于静态文件HEAD和GET的状态码一致): ```bash status_code=$(curl -s -I -o /dev/null -w "%{http_code}" https://example.com/file) ``` 引用[1]中提到了一个错误CURLE_BAD_DOWNLOAD_RESUME(36),这通常与断点续传有关,但与我们当前的任务无关。 引用[2]展示了使用curl发送POST请求,这也相关。 因此,我们只需要关注如何通过HTTP状态码判断文件是否存在。 注意:某些服务器可能会返回200 OK,但实际文件存在(比如重定向到了自定义404页面),因此这种方法并非100%可靠,但对于大多数情况是有效的。 总结命令: 1. 使用HEAD请求(推荐): ```bash curl -I -s -o /dev/null -w "%{http_code}" https://example.com/file ``` 2. 使用GET请求(当HEAD被支持时): ```bash curl -s -o /dev/null -w "%{http_code}" https://example.com/file ``` 在脚本中,我们通常只关心状态码是否为200(或2xx系列)。但注意,3xx表示重定向,如果需要,可以设置curl跟随重定向(使用`-L`),然后检查最终状态码。但是,跟随重定向可能会导致多次请求,并且可能下载重定向后的内容(虽然我们丢弃了内容,但可能增加了网络流量)。 因此,如果希望跟随重定向,可以掉`-L`,这样会返回3xx状态码。如果希望检查最终是否存在,则加上`-L`。 例如,跟随重定向并检查最终状态码: ```bash status_code=$(curl -L -s -o /dev/null -w "%{http_code}" https://example.com/file) ``` 根据需求选择。 最后,注意:如果URL需要认证,可能需要添加用户凭证(如`-u user:pass`)。 因此,完整的检查文件存在的命令(跟随重定向): ```bash curl -I -s -o /dev/null -w "%{http_code}" https://example.com/file ``` 如果只需要在命令行中检查,可以运行上述命令并查看输出是否为200。 如果需要在脚本中判断,则捕获输出并比较。 相关问题: 1. 如何用curl检查HTTP状态码? 2. curl的HEAD方法和GET方法在检查文件存在时有什么区别? 3. 如何让curl跟随重定向并获取最终状态码?</think>### 使用 curl 检查远程文件是否存在下载) #### 核心方法:检查 HTTP 状态码 通过 `-I`(HEAD 请求)和 `-w`(输出格式)参数组合,只获取响应头信息: ```bash curl -s -I -o /dev/null -w "%{http_code}" https://example.com/file.zip ``` #### 操作说明: 1. **基本检查** 状态码为 `200` 表示文件存在: ```bash if [ $(curl -sI -o /dev/null -w "%{http_code}" https://site.com/data.txt) -eq 200 ]; then echo "文件存在" else echo "文件存在" fi ``` 2. **处理重定向(3xx 状态码)** 添加 `-L` 参数跟随重定向: ```bash curl -sIL -o /dev/null -w "%{http_code}" https://short.url/redirected-file ``` 3. **完整响应头分析** 查看完整头信息判断资源状态: ```bash curl -sI https://api.example.com/resource | grep -E "HTTP|Content-Length" ``` 输出示例: ``` HTTP/2 200 Content-Length: 1024 # 文件大小 ``` #### 注意事项: 1. **状态码解读** - `200 OK`:文件存在且可访问 - `404 Not Found`:文件存在 - `403 Forbidden`:无访问权限 - `301/302`:重定向(需配合 `-L`)[^1] 2. **HEAD 请求限制** 部分服务器可能禁用 HEAD 方法,此时改用: ```bash curl -s -o /dev/null -w "%{http_code}" -r 0-0 https://site.com/file ``` `-r 0-0` 表示仅请求 0 字节内容[^2] 3. **认证资源检查** 添加认证信息(如 API token): ```bash curl -sI -H "Authorization: Bearer $TOKEN" https://api.com/protected.bin ``` #### 完整脚本示例 ```bash #!/bin/bash url="https://example.com/important.zip" status=$(curl -sIL -o /dev/null -w "%{http_code}" "$url") case $status in 200) echo "✅ 文件存在" ;; 404) echo "❌ 文件存在" ;; 403) echo "⛔ 无访问权限" ;; 000) echo "💥 网络错误" ;; *) echo "⚠️ 异常状态: $status" ;; esac ``` > **提示**:对于大文件检查,此方法比下载更高效(仅传输头信息,通常 <1KB)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值