Exemplo n.º 1
0
def bytes2zip(bytes):
    """
    RETURN COMPRESSED BYTES
    """
    if hasattr(bytes, "read"):
        buff = TemporaryFile()
        archive = gzip.GzipFile(fileobj=buff, mode='w')
        for b in bytes:
            archive.write(b)
        archive.close()
        buff.seek(0)
        return FileString(buff)

    buff = BytesIO()
    archive = gzip.GzipFile(fileobj=buff, mode='w')
    archive.write(bytes)
    archive.close()
    return buff.getvalue()
Exemplo n.º 2
0
class GmlZBuffer(io.IOBase):
    '''
    
    '''
    def __init__(self):
        self.buffer = StringIO()
        self.compressor = zlib.compressobj(6, ZIP_DEFLATED, -9)
        self.overflow = False
        self.crc = 0
        self.uncompressed_size = 0
        self.compressed_size = 0
        self.compressed_chunk_mark = 0

    def write(self, data):
        self.crc = zlib.crc32(data, self.crc) & 0xffffffff
        self.uncompressed_size += len(data)
        compressed_data = self.compressor.compress(data)
        if not (compressed_data and len(compressed_data)):
            return 0
        compressed_size = len(compressed_data)
        self._prepare_write(compressed_size)
        self.buffer.write(compressed_data)
        self.compressed_size += compressed_size
        return compressed_size

    def _prepare_write(self, length):
        if self.overflow: return
        if self.buffer.tell() + length > _GMLZBUFFER_MAX_SIZE:
            data = self.buffer.getvalue()
            self.buffer.close()
            self.buffer = TemporaryFile()
            self.buffer.write(data)
            self.overflow = True

    def flush(self):
        prev_mark = self.mark
        compressed_data = self.compressor.flush(zlib.Z_FULL_FLUSH)
        compressed_size = len(compressed_data)
        self._prepare_write(compressed_size)
        self.buffer.write(compressed_data)
        self.compressed_size += compressed_size
        self.mark = self.buffer.tell()
        return prev_mark, self.mark