Search code examples
php-7readfilejszip

JSZip reports missing bytes when reading back previously uploaded zip file


I am working on a webapp where the user provides an image file-text sequence. I am compressing the sequence into a single ZIP file uisng JSZip.

On the server I simply use PHP move_uploaded_file to the desired location after having checked the file upload error status.

A test ZIP file created in this way can be found here. I have downloaded the file, expanded it in Windows Explorer and verified that its contents (two images and some HTML markup in this instance) are all present and correct.

So far so good. The trouble begins when I try to fetch that same ZIP file and expand it using JSZip.loadAsync which consistently reports Corrupted zip: missing 210 bytes. My PHP code for squirting back the ZIP file is actually pretty simple. Shorn of the various security checks I have in place the essential bits of that code are listed below

if (file_exists($file)) 
{
 ob_clean(); 
 readfile($file);
 http_response_code(200);
 die();
} else http_response_code(399);

where the 399 code is interpreted in my webapp as a need to create a new resource locally instead of trying to read existing resource data. The trouble happens when I use the result text (on an HTTP response of 200) and feed it to JSZip.loadAsync.

What am I doing wrong here? I assume there is something too naive about the way I am using readfile at the PHP end but I am unable to figure out what that might be.


Solution

  • What we set out to do

    • Attempt to grab a server-side ZIP file from JavaScript
    • If it does not exist send back a reply (I simply set a custom HTTP response code of 399 and interpret it) telling the client to go prepare its own new local copy of that resource
    • If it does exist send back that ZIP file

    Good so far. However, reading the existent ZIP file into PHP and sending it back does not make sense + is fraught with problems. My approach now is to send back an http_response_code of 302 which the client interprets as being an instruction to "go get that ZIP for yourself directly".

    At this point to get the ZIP "directly" simply follow the instructions in this tutorial on MDN.