async def file(location, mime_type=None, headers=None, _range=None): """Return a response object with file data. :param location: Location of file on system. :param mime_type: Specific mime_type. :param headers: Custom Headers. :param _range: """ filename = path.split(location)[-1] async with open_async(location, mode='rb') as _file: if _range: await _file.seek(_range.start) out_stream = await _file.read(_range.size) headers['Content-Range'] = 'bytes %s-%s/%s' % ( _range.start, _range.end, _range.total) else: out_stream = await _file.read() mime_type = mime_type or guess_type(filename)[0] or 'text/plain' return HTTPResponse(status=200, headers=headers, content_type=mime_type, body_bytes=out_stream)
async def file(location, status=200, mime_type=None, headers=None, filename=None, _range=None): """Return a response object with file data. :param location: Location of file on system. :param mime_type: Specific mime_type. :param headers: Custom Headers. :param filename: Override filename. :param _range: """ headers = headers or {} if filename: headers.setdefault('Content-Disposition', 'attachment; filename="{}"'.format(filename)) filename = filename or path.split(location)[-1] async with open_async(location, mode='rb') as _file: if _range: await _file.seek(_range.start) out_stream = await _file.read(_range.size) headers['Content-Range'] = 'bytes %s-%s/%s' % ( _range.start, _range.end, _range.total) else: out_stream = await _file.read() mime_type = mime_type or guess_type(filename)[0] or 'text/plain' return HTTPResponse(status=status, headers=headers, content_type=mime_type, body_bytes=out_stream)
async def file(location, mime_type=None, headers=None): filename = path.split(location)[-1] async with open_async(location, mode='rb') as _file: out_stream = await _file.read() mime_type = mime_type or guess_type(filename)[0] or 'text/plain' return HTTPResponse(status=200, headers=headers, content_type=mime_type, body_bytes=out_stream)
async def aio_generate(): to_send = size async with open_async(location, 'rb') as f: f.seek(start) data = f.read(min(chunk_size, length)) await asyncio.sleep(1) yield data to_send -= min(chunk_size, to_send) while to_send: send = min(chunk_size, to_send) data = f.read(send) yield data await asyncio.sleep(1) to_send -= send
async def file(location, mime_type=None, headers=None): """ Returns response object with file data. :param location: Location of file on system. :param mime_type: Specific mime_type. :param headers: Custom Headers. """ filename = path.split(location)[-1] async with open_async(location, mode='rb') as _file: out_stream = await _file.read() mime_type = mime_type or guess_type(filename)[0] or 'text/plain' return HTTPResponse(status=200, headers=headers, content_type=mime_type, body_bytes=out_stream)
async def output(self, version="1.1", keep_alive=False, keep_alive_timeout=None): async with open_async(self.location, mode="rb") as _file: if self._range: await _file.seek(self._range.start) out_stream = await _file.read(self._range.size) self.headers["Content-Range"] = "bytes %s-%s/%s" % ( self._range.start, self._range.end, self._range.total, ) self.status = 206 else: out_stream = await _file.read() self.body = self._encode_body(out_stream) return await super().output(version, keep_alive, keep_alive_timeout)
async def file(location, mime_type=None, headers=None): """ 文件下载,通过 body_bytes 参数传递文件数据流 异步实现: - 异步打开文件 - 异步读取文件 """ filename = path.split(location)[-1] # 异步打开文件 async with open_async(location, mode='rb') as _file: # 异步读取文件 out_stream = await _file.read() # 文件类型 mime_type = mime_type or guess_type(filename)[0] or 'text/plain' return HTTPResponse(status=200, headers=headers, content_type=mime_type, body_bytes=out_stream)
async def src(request): num = request.match_info.get('num', '0007') print('came into /src') #print(f'{request.headers}') chunk_size = 40960 REMOTE = "/home/odroid/media/3001/00-MediaWorld-3001/55-etc/00-bible/" result = [] async with request.app['pg_engine'].acquire() as conn: #print(str(request.app['tbl'].select().where(num == "3183"))) #async for row in conn.execute(request.app['tbl'].select()): result.append('1') async for row in conn.execute(request.app['tbl'].select().where( request.app['tbl'].c.num == num)): #async for row in conn.execute(sql): #print('select') print(row.title) print(row.file) result.append(row) print(result[0]) #location = REMOTE + result[0].file #'0000_11.mp3' print(len(result)) location = REMOTE + result[1].file #'0000_11.mp3' rng = request.http_range size = os.path.getsize(location) stop = rng.stop if stop is None: stop = size to_send = min(stop - rng.start, size) print(f'\trange:{rng}\n\tfilesize:{size}') if to_send < chunk_size: # 한방 response print('논-스트리밍 모드') headers = { 'Content-Type': 'audio/mp3', 'Accept-Ranges': 'Accept-Ranges: bytes' } #headers['Content-Range'] = f'bytes {rng.start}-{stop - rng.start - 1}/{size}' headers['Content-Range'] = f'bytes {rng.start}-{stop - 1}/{size}' #headers['Content-Range'] = f'bytes {rng.start}-{rng.start + to_send - 1}/{size}' async with open_async(location, 'rb') as f: await f.seek(rng.start) send = to_send data = await f.read(send) #print(data) #print(headers) return Response(body=data, status=200, headers=headers) else: # 스트리밍 모드 print('스트리밍 모드') headers = { 'Content-Type': 'audio/mp3', 'Accept-Ranges': 'Accept-Ranges: bytes' } #headers['Content-Range'] = f'bytes {rng.start}-{stop - rng.start - 1}/{size}' headers['Content-Range'] = f'bytes {rng.start}-{stop - 1}/{size}' #headers['Content-Range'] = f'bytes {rng.start}-{rng.start + to_send - 1}/{size}' resp = StreamResponse(headers=headers, status=206) await resp.prepare(request) print(resp) async with open_async(location, 'rb') as f: print(f'seek to {rng.start}') await f.seek(rng.start) #data = f.read(rng.stop-rng.start) to_send = stop - rng.start while to_send: send = min(chunk_size, to_send) data = await f.read(send) resp.write(data) await resp.drain() to_send -= send print('eof') return resp
async def src(request): num = request.match_info.get('num', '0007') print('came into /src') print(f'{request.headers}') chunk_size = 40960 REMOTE = "/home/odroid/media/3001/00-MediaWorld-3001/55-etc/00-bible/" location = REMOTE + '0000_11.mp3' rng = request.http_range size = os.path.getsize(location) stop = rng.stop if stop is None: stop = size to_send = min(stop - rng.start, size) print(f'\trange:{rng}\n\tfilesize:{size}') if to_send < chunk_size: # 한방 response print('논-스트리밍 모드') headers = { 'Content-Type': 'audio/mp3', 'Accept-Ranges': 'Accept-Ranges: bytes' } #headers['Content-Range'] = f'bytes {rng.start}-{stop - rng.start - 1}/{size}' headers['Content-Range'] = f'bytes {rng.start}-{stop - 1}/{size}' #headers['Content-Range'] = f'bytes {rng.start}-{rng.start + to_send - 1}/{size}' async with open_async(location, 'rb') as f: await f.seek(rng.start) send = to_send data = await f.read(send) #print(data) #print(headers) return Response(body=data, status=200, headers=headers) else: # 스트리밍 모드 print('스트리밍 모드') headers = { 'Content-Type': 'audio/mp3', 'Accept-Ranges': 'Accept-Ranges: bytes' } #headers['Content-Range'] = f'bytes {rng.start}-{stop - rng.start - 1}/{size}' headers['Content-Range'] = f'bytes {rng.start}-{stop - 1}/{size}' #headers['Content-Range'] = f'bytes {rng.start}-{rng.start + to_send - 1}/{size}' resp = StreamResponse(headers=headers, status=206) await resp.prepare(request) print(resp) async with open_async(location, 'rb') as f: print(f'seek to {rng.start}') await f.seek(rng.start) #data = f.read(rng.stop-rng.start) to_send = stop - rng.start while to_send: send = min(chunk_size, to_send) data = await f.read(send) resp.write(data) await resp.drain() to_send -= send print('eof') return resp