php: if (file_exists($file)) returns 对于某些文件为真,对于其他文件为假
php: if (file_exists($file)) returns true for some files, false for others
我很难过。我正在整理一个脚本,从 URL 中获取 PATH_INFO 并使用它从服务器上的特定目录发送文件。
在服务器上:
ll /path/to/directory/with/my/files/
total 7195210
-rwxrwx--- 1 user group 716852833 May 11 15:17 file1.7z
-rwxrwx--- 1 user group 1000509440 May 11 15:31 file2.cxarchive
-rwxrwx--- 1 user group 5878056960 May 11 17:32 file3.ISO
我的代码中有一个 if (file_exists($file)
块,它适用于 file1 和 file2,但是 file3,位于完全相同的位置,它会触发 else语句,表示 PHP 认为该文件不存在。
<?php
//get file name from URL, trim leading slash.
$filename = ltrim($_SERVER['PATH_INFO'], "/");
//sanitize the filename
if(preg_match('/\.\.|[<>&~;`\/$]/', $filename)) {
trigger_error("Invalid path '$filename' attempted by $user");
show_error();
}
//prepend my files directory to the filename.
$file = '/path/to/directory/with/my/files/' . $filename;
//send file
if (file_exists($file)) {
echo '<pre>The file '; print_r($file); echo ' exists.</pre>';
header('X-Sendfile: $file');
exit;
} else {
echo '<pre>the file does not exist?</pre>';
show_error();
}
?>
所以如果我在我的服务器上浏览到以下 URLs:
https://my.server.com/script.php/file1.7z
文件 file1.7z 存在。
https://my.server.com/script.php/file2.cxarchive
文件 file2.cxarchive 存在。
https://my.server.com/script.php/file3.ISO
文件不存在?
一堆测试结果可能是文件很大的罪魁祸首。我知道发送文件时内存限制是个问题,但是我如何才能 PHP 看到这个(大)文件存在?
基于@user3783243 上面的评论:
Because PHP's integer type is signed and many platforms use 32bit integers, some filesystem functions may return unexpected results for files which are larger than 2GB.
所以我写了自己的 file_exists 函数,没有那个限制(基于 comment on that page):
function fileExists($file){
return (@fopen($file,"r")==true);
}
然后,将其插入代码中:
//send file
if (fileExists($file)) { //remove underscore, cap E
echo '<pre>The file '; print_r($file); echo ' exists.</pre>';
header("X-Sendfile: $file"); //fixed, thanks @jamie
exit;
} else {
echo '<pre>the file does not exist?</pre>';
show_error();
}
成功!存在的文件(甚至是大文件),不存在的文件 运行 show_error().
我很难过。我正在整理一个脚本,从 URL 中获取 PATH_INFO 并使用它从服务器上的特定目录发送文件。
在服务器上:
ll /path/to/directory/with/my/files/
total 7195210
-rwxrwx--- 1 user group 716852833 May 11 15:17 file1.7z
-rwxrwx--- 1 user group 1000509440 May 11 15:31 file2.cxarchive
-rwxrwx--- 1 user group 5878056960 May 11 17:32 file3.ISO
我的代码中有一个 if (file_exists($file)
块,它适用于 file1 和 file2,但是 file3,位于完全相同的位置,它会触发 else语句,表示 PHP 认为该文件不存在。
<?php
//get file name from URL, trim leading slash.
$filename = ltrim($_SERVER['PATH_INFO'], "/");
//sanitize the filename
if(preg_match('/\.\.|[<>&~;`\/$]/', $filename)) {
trigger_error("Invalid path '$filename' attempted by $user");
show_error();
}
//prepend my files directory to the filename.
$file = '/path/to/directory/with/my/files/' . $filename;
//send file
if (file_exists($file)) {
echo '<pre>The file '; print_r($file); echo ' exists.</pre>';
header('X-Sendfile: $file');
exit;
} else {
echo '<pre>the file does not exist?</pre>';
show_error();
}
?>
所以如果我在我的服务器上浏览到以下 URLs:
https://my.server.com/script.php/file1.7z
文件 file1.7z 存在。
https://my.server.com/script.php/file2.cxarchive
文件 file2.cxarchive 存在。
https://my.server.com/script.php/file3.ISO
文件不存在?
一堆测试结果可能是文件很大的罪魁祸首。我知道发送文件时内存限制是个问题,但是我如何才能 PHP 看到这个(大)文件存在?
基于@user3783243 上面的评论:
Because PHP's integer type is signed and many platforms use 32bit integers, some filesystem functions may return unexpected results for files which are larger than 2GB.
所以我写了自己的 file_exists 函数,没有那个限制(基于 comment on that page):
function fileExists($file){
return (@fopen($file,"r")==true);
}
然后,将其插入代码中:
//send file
if (fileExists($file)) { //remove underscore, cap E
echo '<pre>The file '; print_r($file); echo ' exists.</pre>';
header("X-Sendfile: $file"); //fixed, thanks @jamie
exit;
} else {
echo '<pre>the file does not exist?</pre>';
show_error();
}
成功!存在的文件(甚至是大文件),不存在的文件 运行 show_error().