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' x43 x54 x4E')) + 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/
赞赏
微信赞赏支付宝赞赏
发表评论