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/
赞赏
微信赞赏
支付宝赞赏
发表评论