python搭建http接口服务返回文件片段HEX

一般http服务返回都是明文可见的字符、json等形式,其实底层还是返回的数据包,如果我们想要实现获取某个文件的指定起始位置的数据,可以让接口分段读取后进行返回,返回的结果可以通过Apifox查看hex的形式来查看(Postman貌似不能以hex格式查看),Fiddler抓包的返回结果也可以hex形式查看!

Fiddler可以在请求编辑里面直接构造请求后,在去查看会话详细--十六进制查看即可。

下面直接上改版的AI代码:

from flask import Flask, Response, make_response,request  
import os
app = Flask(__name__)  


def get_file_range(file_path, start, end):  
    """  
    从文件中读取指定范围的字节。  
      
    :param file_path: 文件路径  
    :param start: 范围的起始字节(包含)  
    :param end: 范围的结束字节(包含)  
    :return: 文件内容的字节对象  
    """  
    try:  
        with open(file_path, 'rb') as file:  
            file.seek(start)  
            # 读取从start到end的字节,注意end+1是为了包含end字节  
            return file.read(end - start + 1)  
    except FileNotFoundError:  
        return b''  
  
@app.route('/file/<filename>', methods=['GET'])  
def serve_file(filename):  
    file_path = f'path/to/your/files/{filename}'  # 修改为你的文件路径  
    file_path = f'./{filename}'
    # 检查HTTP Range头部  
    range_header = request.headers.get('Range')  
    if range_header:  
        # 解析Range头部,这里仅处理简单的"bytes=start-end"格式  
        _, range_str = range_header.split('=')  
        start, end = map(int, range_str.split('-'))  
          
        # 计算文件的总大小  
        total_size = os.path.getsize(file_path)  
          
        # 检查范围是否有效  
        if start >= total_size:  
            return Response(status=416)  # Range Not Satisfiable  
        if end >= total_size:  
            end = total_size - 1  
          
        # 读取文件的部分内容  
        file_content0 = get_file_range(file_path, start, end)  
        #file_content =  bytes(bytearray(b'x43x54x4E'))  + bytes.fromhex('43544E') +file_content0
        # 测试需要我在前面加了固定的hex值,效果可以看文末Winhex内容截图
        file_content =   bytes.fromhex('43544E') +file_content0
        # 设置响应头部  
        response = make_response(file_content)  
        response.headers['Content-Range'] = f'bytes {start}-{end}/{total_size}'  
        response.headers['Accept-Ranges'] = 'bytes'  
        response.headers['Content-Length'] = str(len(file_content))  
        response.status_code = 206  # Partial Content  
          
        return response  
    else:  
        # 没有Range头部,发送整个文件  
        # 注意:在实际应用中,对于大文件,你可能不想这样做  
        # 这里仅作为演示  
        with open(file_path, 'rb') as file:  
            return Response(file.read(), mimetype='application/octet-stream')  
  
if __name__ == '__main__':  
    app.run(debug=True)

实际测试的时候windows下安装curl或直接相关接口测试工具调用即可。

#下面这个是使用了127.0.0.1这个代理来进行curl请求 下载1.bin文件 输出到24文件
curl -x http://127.0.0.1:8080  -w -i "http://localhost:5000/file/1.bin"   --output 24

# 获取指定开始结束内容,只获取body部分;下面语句是一行
# curl -x http://127.0.0.1:8080  -w -i -H "Range: bytes=0-90" http://localhost:5000/file/1.bin --output 22

hex查看工具WinHex

上面curl命令下载的文件,可以用Winhex打开直接查看十六进制文件;当然这个工具还有字节统计、CRC校验等功能,甚至强大到有人可以利用它恢复误删数据,当然我这里只是为了单纯验证下分段返回数据流是否正常而已。

正常java等开发语言都可以实现这种功能。

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/python-http-file-range/

赞赏

微信赞赏支付宝赞赏

发表评论