在我的网站上,我允许用户提交文件,然后将它们发送到数据库和我创建的文件目录devFiles。它发送到数据库很好,但当我发送到目录,它永远不会发送,我得到我创建的错误消息,看看它是否发送。我认为问题在于
if(is_file($dir.'/'.$file_name)==false){
//code...
}
但我尝试改变条件,但它没有奏效。所以我想要做的是,将提交的文件发送到手头创建的文件目录。这是我的代码
PHP
$query = "INSERT INTO pack_screenshots(pack_id, file_name, file_tmp)VALUES(:packid, :file_name, :file_tmp)";
$stmtFileUpload = $handler->prepare($query);
$errors = array();
foreach($_FILES['file']['tmp_name'] as $key => $error){
if ($error != UPLOAD_ERR_OK) {
$errors[] = $_FILES['file']['name'][$key] . ' was not uploaded.';
continue;
}
$file_tmp = file_get_contents($_FILES['file']['tmp_name'][$key]);
$file_name = addslashes(trim($_FILES['file']['name'][$key]));
try{
$stmtFileUpload->bindParam(':packid', $packid, PDO::PARAM_STR);
$stmtFileUpload->bindParam(':file_name', $file_name, PDO::PARAM_STR);
$stmtFileUpload->bindParam(':file_tmp', $file_tmp, PDO::PARAM_STR);
$dir = "devFiles";
if(is_dir($dir)==false){
mkdir($dir, 0700);
}
if(is_file($dir.'/'.$file_name)==false){
if(!move_uploaded_file($file_tmp,$dir.'/'.$file_name)){
die("File didn't send!");
}
}else{
$_SESSION['invalid'] = true;
header("Location: developer_invalid.php");
exit;
}
$stmtFileUpload->execute();
$_SESSION['thankyou'] = true;
header("Location: developerUpload_thankyou.php");
exit;
}catch(PDOException $e){
$errors[] = $file_name . 'not saved in db.';
echo $e->getMessage();
}
}
答案 0 :(得分:1)
PHP文档bool move_uploaded_file(string $ filename,string $ destination)
你做了:
move_uploaded_file($file_tmp,$dir.'/'.$file_name)
move_uploaded_file期望$ file_tmp成为tmp文件的路径,但是你使用了
$file_tmp = file_get_contents($_FILES['file']['tmp_name'][$key]);
所以$ file_tmp不再是路径,而是它自己的内容 因此,要解决上传问题,只需使用tmp文件路径。
if(!move_uploaded_file($_FILES['file']['tmp_name'][$key],$dir.'/'.$file_name)){
此外,您应该删除文件名上的addslashes(),因为它可能会产生意外的结果。相反,您可以使用以下内容清理文件名:
$file_name = preg_replace("/[^a-z0-9\.]/", "_", strtolower($_FILES['file']['name'][$key]));
您还应该考虑在文件名中添加一个随机数,这样用户就不会覆盖具有相同名称的其他用户文件:例如,me.png可能对于头像来说很常见。保存为
会更安全$filename = strtotime("now")."_me.png";
最后一点,使用is_file()在某些情况下也会导致问题
注意:由于PHP的整数类型已签名且许多平台使用32位整数,因此某些文件系统函数可能会为大于2GB的文件返回意外结果。
使用file_exists()代替