【发布时间】:2014-08-10 08:05:23
【问题描述】:
每个人。我无法让 PHP 将文件向上移动到目录中。 mkdir 在创建目录时工作得很好,并且 mysql 表正在插入所有文件。不过,move_uploaded_file 步骤无法正常工作。
//filestorage variables
$uniqid = uniqid();
$folder = 'documents/' . $uniqid; //drill down further with m/d currentDate
$file = $_FILES['file'];
$i = 0;
//iterate through $_FILES array
foreach ($file as $f){
$temp = $file['tmp_name'][$i];
$name = $file['name'][$i];
$dest = $folder . '/' . $name;
//store file on server
if(!file_exists($folder)){
mkdir($folder);
chmod($folder, 0755);
}
if(isset($_FILES['file'])){
move_uploaded_file($temp, $dest);
echo "upload complete";
if(move_uploaded_file($temp, $dest)){
echo '<p> successful step </p>' . $dest;
}
}
//prepare and submit files to database
if (count($_FILES) > 0){
if(is_uploaded_file($temp)) {
echo '<p>' . "The file is, in fact, uploaded." . '</p>';
$sql = "INSERT INTO uploads (`file_dest`) VALUES ( :dest )";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':dest', $dest, PDO::PARAM_STR, strlen($dest));
$stmt->execute();
echo 'the following file was uploaded <p><img src="' . $dest . '" /></p>';
echo 'from ' . $folder . '/' . $name;
}
}
$i++;
}
我是否需要将目标名称完全限定到根级别?在使目录名称变得有点棘手之后,我在某个时刻弄坏了一些东西。当文件夹刚刚被称为“文档”时,这是有效的(当然,当时的代码也有点不同。
我在 apache 的错误日志中收到的错误信息如下:
[Thu Jun 19 11:30:01 2014] [error] [client 127.0.0.1] PHP Warning: chmod() [function.chmod]: Operation not allowed in /Volumes/Secure/project/Web/Webroot/ public_html/index.php 在第 65 行,引用者:MyWebpage
[2014 年 6 月 19 日星期四 11:30:01] [错误] [客户端 127.0.0.1] PHP 警告:move_uploaded_file(documents/53a310094d082/0000b.jpg) [function.move-uploaded-file]:无法打开流: 第 68 行 /Volumes/Secure/project/Web/Webroot/public_html/index.php 中的权限被拒绝,引用者:MyWebpage
[Thu Jun 19 11:30:01 2014] [error] [client 127.0.0.1] PHP Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/private/var/tmp/ phptrm0HP' 到 /Volumes/Secure/ 中的 'documents/53a310094d082/0000b.jpg' project/Web/Webroot/public_html/index.php 第68行,referer:MyWebpage
【问题讨论】:
-
您的代码很危险。您在目标路径中直接使用
['name'],这允许恶意用户在您的服务器上随意乱写他们选择的文件。 -
对于
if(isset($_FILES['file'])){和if(isset($_FILES['file'])){,您缺少右大括号} -
连接打开后立即添加
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);。 -
感谢这些建议。关于我要问的权限问题的任何意见?
标签: php mysql file-upload upload filesystems