Почему менеджер загрузок не может скачать правильно? - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть файл в памяти, и я хочу передать файл в браузер, чтобы пользователь мог загрузить ссылку за раз.

Ссылка, которую получает пользователь, выглядит следующим образом:

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...