As the files are within the same WP installation (not a remote), you don’t need to download the file using get_file_contents(), try to add the file using its absolute path of the attachment.
if(isset($_POST['download'])){
$tmpFile = tempnam('/tmp', '');
$zip = new ZipArchive();
$zip->open($tmpFile, ZipArchive::CREATE);
foreach( $list_posts as $list_item ) :
if ( $list_item->post_type == 'crb_photo' ):
if ( has_post_thumbnail( $list_item->ID ) ) {
$zip->addFile(get_attached_file(get_post_thumbnail_id($list_item->ID )));
}
}
}
$zip->close();
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename=artist-photos.zip');
header('Content-Length: ' . filesize($tmpFile));
readfile($tmpFile);
unlink($tmpFile);
}
Note typed the code in this editor, may contain syntax error.