尝试通过PHP脚本上传文件时,我确实有一种非常奇怪的行为。
首先,这里有几个信息:
multipart/form-data
”我的上传目录/home/www/public/files/images
有一个777 chmod
ls -l /home/www/public/files/
total 68K
drwxrwxrwx. 90 pel pel 64K juin 23 18:06 images
现在,这是我使用的代码:
if (!empty($_FILES['image'])) {
$dir = '/home/www/public/files/images';
$extension = mb_strtolower(pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION));
$newfile_name = 'myimage-with-my-name.' . $extension;
$newfile_path = $dir . '/' . $newfile_name;
if (!is_writable($dir)) {
throw new Exception('Upload: Cant write in ' . myescape($dir));
}
if (!in_array($extension, array('png', 'gif', 'jpg', 'jpeg'))) {
throw new Exception('Upload: Unsupported extension ' . myescape($extension));
}
if ($_FILES['image']['error'] > 0) {
throw new Exception('Upload: Error code ' . myescape($_FILES['image']['error']));
}
print_r($_FILES['image']);
print_r(array($_FILES['image']['tmp_name'], $newfile_path));
if (!move_uploaded_file($_FILES['image']['tmp_name'], $newfile_path)) {
die('ERROR: Upload Failed');
}
}
结果如下:
Array
(
[name] => sampleimage.jpg
[type] => image/jpeg
[tmp_name] => /tmp/phpaLjZyD
[error] => 0
[size] => 11721
)
Array
(
[0] => /tmp/phpaLjZyD
[1] => /home/www/public/files/images/myimage-with-my-name.jpg
)
Error: Upload Failed
如您所见,没有错误,没有抛出“先前”异常(is_write,extension ...),最后move_uploaded_file
失败。
奇怪的行为是:
sampleimage.jpg
,而不是我想要的myimage-with-my-name.jpg
您有解决此问题的提示或解决方案吗?
提前致谢。
答案 0 :(得分:0)
错误可能来自
$dir = '/home/www/public/files/images';
显示实际文件脚本的路径... 它需要是一个相对路径...我猜你在/ home /
之前不在文件夹上也许它应该像$dir = './public/files/images';
此外,您应该使用if (!empty($_FILES['image']['name']))
答案 1 :(得分:0)
正如php.net move_uploaded_file()
所述,open_basedir
知道。
move_uploaded_file()
既是安全模式,也是open_basedir。但是,仅限于目标路径上的限制,以允许移动文件名可能与此类限制冲突的上载文件。 move_uploaded_file()通过仅允许移动通过PHP上传的文件来确保此操作的安全性。
请检查您的open_basedir设置为什么,如果您的目录不在open_basedir之下,请将其移至open_basedir值位置以下。
希望它有所帮助。
答案 2 :(得分:0)
您确定move_uploaded_file()
功能问题。您可以检查php错误日志或在脚本error_reporting(E_ALL)
中设置。
apache日志中没有错误,因为文件没有错误 - [error] => 0
且大小为[size] => 11721
。您需要检查PHP错误日志。
此外,您可以尝试使用copy()
函数来验证move_uploaded_file()
函数不存在问题。