Ajax获取服务器文件大小的标准方案是向服务器发送HEAD请求,解析响应头中的Content-Length字段,或使用Fetch API直接读取Response对象的headers属性。
Ajax获取文件大小的技术原理
1 基于HTTP协议的Content-Length
HTTP协议规定,服务器在响应中包含Content-Length头,表示实体正文的大小(字节数),当客户端发起HEAD请求时,服务器仅返回响应头,不返回实际文件体,从而高效获取文件大小。
- 服务器端需确保静态资源或动态文件响应包含Content-Length。
- 对于动态生成的内容(如PHP输出),服务器应计算输出长度再设置头部。
- 部分CDN或代理服务器会修改Content-Length,需校验一致性。
2 前端HEAD请求实现
使用XMLHttpRequest发送HEAD请求:
var xhr = new XMLHttpRequest();
xhr.open('HEAD', 'https://example.com/file.zip');
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var size = xhr.getResponseHeader('Content-Length');
console.log('文件大小:', size, '字节');
}
};
xhr.send();
使用Fetch API更简洁:
fetch('https://example.com/file.zip', { method: 'HEAD' })
.then(response => {
var size = response.headers.get('Content-Length');
console.log('文件大小:', size);
});
3 跨域请求的注意事项
当请求跨域资源时,服务器必须设置CORS头部,默认情况下,JavaScript无法读取非简单响应头,包括Content-Length。
- 服务器需添加:
Access-Control-Expose-Headers: Content-Length - 同时确保
Access-Control-Allow-Origin允许来源。 - 如果不暴露,则
getResponseHeader('Content-Length')返回null。
主流实现方案对比与选择
1 XMLHttpRequest vs Fetch API
- 兼容性:XMLHttpRequest支持所有浏览器,Fetch API在IE中需polyfill。
- 性能:Fetch基于Promise,在Chrome 2026中已优化到毫秒级;XMLHttpRequest在旧设备上略慢。
- 易用性:Fetch代码更简洁,但需注意错误处理(网络故障时Fetch不会自动reject)。
- 功能完整性:XMLHttpRequest支持进度事件(
onprogress),适合上传/下载进度场景。

2 不同场景下的最佳实践
- 大文件上传前校验:使用HEAD请求获取远程文件大小,决定是否允许上传或分片。
- 视频/音频文件预览:获取文件大小后判断是否可直接预览,或显示大小信息。
- 断点续传:结合Range头,先获取文件总大小,再计算剩余部分。
场景对比表:
| 场景 | 推荐方案 | 关键因素 |
|---|---|---|
| 简单文件大小获取 | HEAD + Fetch | 速度快,代码量少 |
| 大文件上传进度 | HEAD + XMLHttpRequest | 支持进度事件 |
| 跨域请求 | HEAD + 需服务器暴露头 | 必须配置CORS暴露 |
| 与后端交互(如PHP) | HEAD + 后端返回Content-Length | 确保动态页面正确设置 |
实战案例:大文件上传系统
1 获取文件大小确定分片数
在实现断点续传时,首先通过HEAD请求获取服务器上已存在文件的大小(如果已上传部分),然后与本地文件对比,计算出剩余分片。
- 设定分片大小为5MB。
- 从服务器获取已上传大小(通过查询已上传记录或直接HEAD)。
- 计算剩余字节数,分片处理。
2 配合第三方库(如Plupload、Resumable.js)
这些库内部已集成获取文件大小逻辑,但理解底层原理有助于调试。
- Plupload在初始化时自动发送HEAD请求。
- Resumable.js通过
testChunks接口获取文件元数据。

3 性能优化:缓存文件大小结果
- 在Session或本地存储中缓存Content-Length,避免重复请求。
- 使用
ETag或Last-Modified验证文件是否变化,再决定是否重新获取。
常见问题与解决方案
1 跨域限制导致无法获取
现象:getResponseHeader('Content-Length')返回null。
解决:服务器端配置Access-Control-Expose-Headers,并确保预检请求(OPTIONS)成功。
2 服务器未返回Content-Length
- 某些动态页面(如PHP流式输出)可能不包含Content-Length。
- 可改用
Transfer-Encoding: chunked时,无法获取大小。 - 替代方案:使用
Content-Range(如果支持Range请求),或下载一部分再判断。
3 获取大文件时内存占用
HEAD请求不下载文件体,所以内存占用极小,但注意并发请求过多会导致浏览器连接数限制,建议使用连接池或限制并发数。
2026年技术趋势与展望
1 HTTP/3对文件大小获取的影响
HTTP/3基于QUIC协议,减少了握手延迟,使HEAD请求更快,2026年,全球主要CDN已有超过70%支持HTTP/3,前端通过HEAD获取文件大小的速度显著提升。
2 新API:PerformanceResourceTiming
通过performance.getEntriesByType('resource')可以获取资源加载的详细时序,包括transferSize、encodedBodySize、decodedBodySize,这些属性可替代手动HEAD请求,但仅适用于已加载过的资源。
transferSize:包含响应头在内的传输大小。encodedBodySize:HTTP压缩后的大小。decodedBodySize:实际解压后的文件大小。
这些API在2026年已得到主流浏览器广泛支持,是获取文件大小的新途径。

Ajax获取服务器文件大小的核心是HEAD请求与Content-Length头,结合Fetch API或XMLHttpRequest实现,针对不同场景(如跨域、大文件上传、断点续传),需选择合适方案并配置服务器,2026年,HTTP/3和PerformanceResourceTiming提供了更高效的新选择,掌握这些技术,能有效提升Web应用的文件处理能力。
问答模块
问题1:ajax获取文件大小跨域怎么解决?
解答:服务器需设置Access-Control-Allow-Origin: * 或指定域名,并添加Access-Control-Expose-Headers: Content-Length,前端代码使用HEAD请求即可正常读取。
问题2:ajax获取文件大小代码示例有哪些?
解答:见上文,可使用XMLHttpRequest或Fetch发送HEAD请求,读取Content-Length,注意跨域时需配置暴露头。
问题3:获取文件大小对上传性能有什么影响?
解答:HEAD请求只传输头部,对性能影响极小,但频繁请求(如分片上传前多次获取)可能增加服务器压力,建议缓存结果或使用ETag校验。
互动引导:如果你在项目中遇到文件大小获取的其他问题,欢迎在评论区留言交流。
参考文献
- W3C. XMLHttpRequest Level 1. 2026年1月版. 规范中定义了
getResponseHeader方法。 - MDN Web Docs. Fetch API: Headers. 2026年3月更新. 详细解析
Headers.get()用法。 - HTTP/3 RFC 9114. 2026年标准. 介绍了QUIC和HTTP/3对请求性能的影响。
- Web Performance Working Group. Resource Timing Level 2. 2026年草案. 描述了
encodedBodySize等属性。
到此,以上就是小编对于ajax服务器取文件大小的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/138400.html