Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP压缩文件是否为空?_Php - Fatal编程技术网

PHP压缩文件是否为空?

PHP压缩文件是否为空?,php,Php,我有一个脚本,可以从特定目录中的文件创建zip文件。下载后,对于很多用户来说,zip文件是空的。但是,对于其他用户,文件不是空的。是不是我做错了什么 header('Content-type: application/zip'); header('Content-Disposition: attachment; filename="'.$id.'.zip"'); header('Cache-Control: private'); ob_clean(); flush(); readfile("".

我有一个脚本,可以从特定目录中的文件创建zip文件。下载后,对于很多用户来说,zip文件是空的。但是,对于其他用户,文件不是空的。是不是我做错了什么

header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="'.$id.'.zip"');
header('Cache-Control: private');
ob_clean();
flush();
readfile("".$id.".zip");
exit;

最好添加一些错误控制:

$file = "{$id}.zip";
if (!is_readable($file))
{
    die('Not accessible.');
}
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="'.$file.'"');
header('Cache-Control: private');
ob_clean();
flush();
readfile($file);
exit;

另外,将输出缓冲配置与读取文件进行三次检查

我在前面推荐了这个建议,这里是我所说内容的框架。这是未经测试的,因为我目前没有访问php的权限

$filename = $id . '.zip';
$handle = fopen($filename, 'r');
if ($handle === false)
{
    die('Could not read file "' . $filename . '"');
}

header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Cache-Control: private');
while (!feof($handle))
{
    echo fread($handle, 8192);
}
fclose($handle);
exit;

问题是否与文件名相关?(例如,使用引号、空格或其他特殊字符)用户之间的
$id
是否不同?当他们得到一个空文件时,最好向他们询问文件名。顺便问一下,
$id
是否被正确清理?这似乎是非常容易开发的。我会考虑在事件文件化($ID.'.zip)中实现一些日志记录。(0)实现文件的哈希,以确保文件使ITI不在FILIE.Eng存在检查中销售,它不考虑像文件存在但不具有读取权限的情况。存在争用条件等。我建议在设置标头之前使用fopen的流式解决方案。也有,true,已更改。仍然存在争用条件,例如在可读检查之后但在读取文件之前删除文件的进程。在头之前使用fopen可以防止这种情况,即使文件已从分配表中删除,但在资源存在时仍可以读取。为什么在双引号内使用花括号?以使变量更明显
“$zip.zip”
也可以,但它不是很清楚。由于您喜欢句柄,我建议您使用它,而不是在文件上循环。