生の「圧縮」形式を使用してアップロードしている場合、アップロードされているデータのサイズに関する情報はありません。Paxはこの点で正しいです。
ファイルサイズが4GBを超えないと仮定すると、圧縮バッファーの先頭に4バイトのヘッダーとして保存できます。
例としていくつかのCコード:
uint8_t *compressBuffer = calloc(bufsize + sizeof (uLongf), 0);
uLongf compressedSize = bufsize;
*((uLongf *)compressBuffer) = filesize;
compress(compressBuffer + sizeof (uLongf), &compressedSize, sourceBuffer, bufsize);
次に、compressedSize + sizeof(uLongf)のサイズの完全なcompressBufferを送信します。サーバー側でデータを受け取ったら、次のコードを使用してデータを取り戻すことができます。
// data is in compressBuffer, assume you already know compressed size.
uLongf originalSize = *((uLongf *)compressBuffer);
uint8_t *realCompressBuffer = compressBuffer + sizeof (uLongf);
クライアントが正しいサイズを送信することを信頼できない場合は、サーバーサイズに対して何らかの非圧縮データチェックを実行する必要があります。/ dev/nullへのuncompressを使用するという提案は妥当なものです。
.zipファイルをアップロードする場合は、圧縮されていないときのファイルのサイズを示すディレクトリが含まれています。この情報はファイル形式に組み込まれていますが、これも悪意のあるクライアントの影響を受けます。