我正在编写一个服务器,它将压缩文件并通过 http 套接字发送它们。
不幸的是,它们并不是真正的文件,它们更像是来自远程源的数据库条目。
我想压缩内存中的每个条目,然后通过我的 http 服务器将它们发送出去,每个条目都可能很大,比如每个 1GB。
我以块的形式从源接收数据,例如 16mb(但可以是任何有意义的块大小)。
从概念上讲,这就是正在发生的事情,尽管这是一些伪代码:
archive *_archive = archive_write_new();
//set to zip format
bool ok = true;
ok |= archive_write_set_format( _archive, ARCHIVE_FORMAT_ZIP );
ok |= archive_write_add_filter( _archive, ARCHIVE_FILTER_NONE );
char *_archiveBuffer = malloc(8192);
size_t _used;
ok = archive_write_open_memory( _archive, _archiveBuffer, 8192, &_used );
if (!ok) return ERROR;
archive_entry *_archiveEntry = archive_entry_new();
//fetch metadata about the object by id
QString id = "123456789";
QJsonObject metadata = database.fetchMetadata(id);
int size = metadata["size"].toInt();
//write the http header
httpd.writeHeader(size);
archive_entry_set_pathname( _archiveEntry, "entries/"+id );
archive_entry_set_size( entry, size );
archive_entry_set_filetype( _archiveEntry, AE_IFREG );
//archive_entry_set_perm( entry, ... );
archive_write_header( _archive, _archiveEntry );
int chunksize = 16777216;
for (int w = 0; w < size; w+=chunksize)
{
QByteArray chunk = database.fetchChunk(id,chunksize);
archive_write_data( _archive, chunk.data(), (size_t) chunk.size() );
//accumulate data, then fetch compressed data from _archiveBuffer and write to httpd
if (_used > 0)
{
httpd.writeData(_archiveBuffer);
//clear archive buffer?
}
}
archive_entry_free(_archiveEntry);
archive_write_close(_archive);
httpd.writeData(_archiveBuffer);
archive_write_free(_archive);
问题是,我如何知道数据何时被压缩到 _archiveBuffer,何时压缩,如何读取缓冲区然后清除它,重置 _used 计数器。我假设如果_used>0
发生了压缩/刷新。
另外,_archiveBuffer 是否需要大于我的块大小?
似乎我可能需要使用回调,但不清楚如何将 archive_write_open 与回调和内存缓冲区一起使用。
我似乎无法在网上找到示例。
任何帮助,将不胜感激!