У меня есть файл в памяти, и я хочу передать файл в браузер, чтобы пользователь мог загрузить ссылку за раз.
Ссылка, которую получает пользователь, выглядит следующим образом:
http://domain-name.com/download
Когда пользователь вводит ссылку в браузере, он может наблюдать за воспроизведением файла в браузере.
Он может войти и загрузить ссылку в диспетчере загрузок на страницев то же время.
Я добавляю content-length
к IDM
, могу получить File size
и Time left
, также я добавляю 'Accept-Range' к заголовкам, чтобы активировать resume capability
в менеджере загрузок. Хотя я добавил соответствующие параметры, когда пользователь вводит ссылку в IDM
и нажимает кнопку pause
, а затем кнопку start
, ссылка начинается с 0%
и загрузка не продолжается.
Тем не менее, ожидается продолжение работы после нажатия пользователем кнопки start
.
Когда я попробовал ссылку как пользователь (например, файл размером 8,5 МБ), вывод IDM
заголовков запросадиапазон был:
bytes=0- # start download
bytes=8552448-
bytes=614400-8593167
bytes=4648823-8593167
bytes=1908016- # when i hit pause button
Затем IDM
начинаются с 0% загрузки, а должны начинаться с 1908016
байта.
Код выглядит следующим образом: Код записывается сpython 3
и aiohttp
рамки.
@routes.get('/download')
async def handle(request):
offset = 0
filepath = 'path/to/file/sample.mp4'
filename = 'sample.mp4'
size = os.path.getsize(filepath)
hh = dict(request.headers)
if 'Range' in hh:
offset =int(hh['Range'][6:].split('-')[0])
with open(filepath, 'rb') as f:
resp = Response(status=206 if offset else 200,
headers={'Content-Type': mimetypes.guess_type(filename)[0],
'CONTENT-LENGTH': str(size-offset),
'Accept-Ranges': 'bytes',
'CONNECTION': 'keep-alive',
'Content-Range': 'bytes %d - %d/%d' % (offset, size, size)
}
)
data = f.read()
await resp.prepare(request)
await resp.write(data)
return resp
app = web.Application()
app.add_routes(routes)
web.run_app(app,host='0.0.0.0')