内容

    服务器响应 206 Partial Content

    HTTP 状态码 206 (部分内容) 的定义

    HTTP 状态码 206(部分内容)表示服务器成功处理了客户端的部分请求,并返回了所请求资源的仅部分内容。这个状态码在客户端请求文件的特定部分时非常有用,特别是在数据流传输或下载大文件的情况下。

    206 - Partial Content

    状态 206 的实际应用示例

    • 大文件下载的使用
      • 客户端可以请求文件的特定部分,例如在下载过程中暂停后恢复。
      • 请求示例包括使用 Range 头部。
    • 视频和音频流媒体的应用
      • 流媒体如何通过缓冲和数据传输来工作。
      • 服务器和客户端的实现示例。
    • 内容分发网络 (CDN) 的使用
      • CDN 如何利用 206 优化内容加载。

    使用 Range 头部的请求示例

    Range 头部的格式如下:

    Range: bytes=0-499

    以下是获取文件特定字节的请求示例:

    GET /video.mp4 HTTP/1.1
    Host: example.com
    Range: bytes=0-499

    服务器返回状态 206 的响应包含以下头部:

    HTTP/1.1 206 Partial Content
    Content-Range: bytes 0-499/1234
    

    在不同编程语言中处理 206 状态码

    • PHP
      • 实现部分文件下载的示例:
      • <?php
        // 文件路径
        $file = 'path/to/file.zip';
        $size = filesize($file);
        $length = $size;
        $start = 0;
        $end = $size - 1;
        
        header("HTTP/1.1 206 Partial Content");
        header("Content-Type: application/octet-stream");
        header("Content-Length: " . $length);
        header("Content-Range: bytes $start-$end/$size");
        readfile($file);
        ?>
                    
    • Python
      • 使用 Flask 处理部分请求的示例:
      • from flask import Flask, request, Response
        
        app = Flask(__name__)
        
        @app.route('/file')
        def get_file():
            range_header = request.headers.get('Range', None)
            if not range_header:
                return Response(status=416)
            
            # 处理 Range 头部
            start, end = parse_range(range_header)
            with open('file.zip', 'rb') as f:
                f.seek(start)
                data = f.read(end - start + 1)
                response = Response(data, status=206)
                response.headers.add('Content-Range', f'bytes {start}-{end}/{file_size}')
                return response
                    
    • Node.js
      • 使用 Express 处理 Range 请求的示例:
      • const express = require('express');
        const fs = require('fs');
        const app = express();
        
        app.get('/file', (req, res) => {
            const range = req.headers.range;
            if (!range) {
                return res.sendStatus(416);
            }
        
            const filePath = 'path/to/file.zip';
            const fileSize = fs.statSync(filePath).size;
            const start = Number(range.replace(/\D/g, ""));
            const end = fileSize - 1;
        
            res.writeHead(206, {
                'Content-Range': bytes ${start}-${end}/${fileSize},
                'Accept-Ranges': 'bytes',
                'Content-Length': end - start + 1,
                'Content-Type': 'application/octet-stream',
            });
        
            const stream = fs.createReadStream(filePath, { start, end });
            stream.pipe(res);
        });
                    

    常见错误及其修复

    • 与 Range 头部相关的错误
      • 如果 Range 头部格式不正确,服务器可能返回 416 状态码(请求范围不满足)。
      • 确保请求的范围在文件大小范围内。
    • 避免部分下载中的错误
      • 在实现部分下载时,确保正确处理每个请求的状态。
      • 建议在开发中进行详细的测试和调试,以确保没有遗漏。
    状态码 描述 常见用途
    206 部分内容 大文件下载、视频流、CDN 优化
    416 请求范围不满足 无效的 Range 头部

    通过上述示例和实现,开发者可以有效地利用 HTTP 状态码 206 来优化文件下载和流媒体服务。这不仅能提升用户体验,还能减少服务器负担,提高效率。