Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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