我正在尝试将图像上传到数据库并收到此PHP错误消息:
警告:move_uploaded_file(/upload/efc5ad334bca9f31b19d85a6cc2ada57/-416649605.jpg(:无法打开流:在第51行的C:''xampp''htdocs''learnphp''gettingstarted.php中没有这样的文件或目录
警告:move_uploaded_file((:无法将 C:''xampp''tmp''phpA9E6.tmp' 移动到 '/upload/efc5ad334bca9f31b19d85a6cc2ada57/-416649605.jpg' 在第 51 行的 C:''xampp''htdocs''learnphp''gettingstarted.php 上传失败。
这是我的 php 脚本:
<?php
require("include/functions.php");
check_session();
$logged_user = $_SESSION['username'];
if(isset($_FILES['avator']['name']) && $_FILES['avator']['tmp_name'] !=""){
//setting file properties
$fileName = $_FILES['avator']['name'];
$filetmpLoc = $_FILES['avator']['tmp_name'];
$fileType = $_FILES['avator']['type'];
$filesize = $_FILES['avator']['size'];
$fileErrMsg = $_FILES['avator']['error'];
//explose the filename extention into an array
$kaboom = explode('.',$fileName);
$fileExt = end($kaboom);
list($width ,$height) = getimagesize($filetmpLoc);
if( $width <10 || $height <10 ){
//the image has not dimenssion
echo 'The Image has no dimension.Try again!';
exit();
}else{
// The image is has dimension so its OK
$db_file_name = rand(100000000000,999999999999).".".$fileExt;
//check the size of the image
if($filesize > 1048576){
echo 'Your avator file size was larger than 1mb.';
exit();
}else if(!preg_match('/'.(gif|png|jpg)$/i',$fileName)){
echo"Your avator file was not JPG,PNG or GIF type.Try again.";
exit();
}else if($fileErrMsg == 1){
echo "Unknoan Error occured. Upload Fail.";
exit();
}
//move uploaded avator
$moveResult = move_uploaded_file( $filetmpLoc,"/upload/$logged_user/$db_file_name");
if( $moveResult !=true){
echo 'Upload Fail.';
exit();
}else{
//resize the image
include_once("include/resizeimage.php");
$target_file = "user/$logged_user/$db_file_name";
$resize_file ="user/$logged_user/$db_file_name";
$wmax = 200;
$hmax = 230;
img_resize($target_file,$resize_file,$wmax,$hmax,$fileExt);
$sql = "UPDATE mygust SET avatar = '$db_file_name' WHERE username='$logged_user' LIMIT 1";
$query = mysqli_query($con,$sql);
mysqli_close($con);
exit();
}
}
}
?>
我的 HTML 代码是:
<form id="u_pro_pic" method="post" enctype="multipart/form-data" onSubmit="" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
<h2>Set your Profile Avator</h2><br>
<div id="av_wrap"><div id="avator_div"><img src="image/blank-profile.png" class="avator" title="Chose a file to upload" onClick="triggerUpload(event,'avator')"></div>
<div id="ad_clarleft">
<input type="button" class="add" title="Choose a file to upload" onClick="triggerUpload(event,'avator')" value="Add Avator"><br>
<hr>
<p>These brethren have uploaded their's and you should too. </p>
</div>
</div>
<input name="avator" type="file" id="avator" form="u_pro_pic" onChange="readURL(this)">
<input type="submit" name="u_avator" id="sumit" class="avt" value="Upload">
</form>
请任何帮助将不胜感激。
PHP 会尝试将您上传的文件移动到不存在的文件夹中:
//move uploaded avator
$moveResult = move_uploaded_file( $filetmpLoc,"/upload/$logged_user/$db_file_name");
路径"/upload"看起来不像正确的窗口路径。将其更改为类似"C:''xampp''htdocs''learnphp''upload"的内容。如果此文件夹不存在,请手动创建此文件夹。
//move uploaded avator
$moveResult = move_uploaded_file( $filetmpLoc,"C:/xampp/htdocs/learnphp/upload/$logged_user/$db_file_name");
您在上传时收到错误的原因是文件夹本身不存在; 至少这是我从中得到的印象,老实说,我们不知道efc5ad334bca9f31b19d85a6cc2ada57
是否存在。
旁注:使用本答案中进一步引用的file_exists()
。
- 由于您使用会话作为用户名会话数组
$logged_user
,因此请确保会话已使用会话在所有文件中启动。session_start();
必须驻留在所有文件中,并且位于代码的顶部。
最好检查会话是否也使用 isset()
或 !empty()
进行设置。
引用:
- http://php.net/manual/en/function.session-start.php
- http://php.net/manual/en/function.isset.php
- http://php.net/manual/en/function.empty.php
如果没有(我很确定它没有(,您首先需要使用 mkdir()
函数创建它。
- http://php.net/manual/en/function.mkdir.php
语法是:mkdir("/path/to/my/dir", 0700);
- 0700
可以更改为0755
这是文件夹的常用设置,必须对其进行设置,以便可以使用chmod写入文件夹。
- http://php.net/manual/en/function.chmod.php
语法是手册中列出的 3 种语法之一:
chmod("/somedir/somefile", 755); // decimal; probably incorrect
chmod("/somedir/somefile", "u+rwx,go+rx"); // string; incorrect
chmod("/somedir/somefile", 0755); // octal; correct value of mode
因此,您需要在会话文件之后使用mkdir()
函数,然后将其"移动"到由$logged_user
及其关联名称创建的文件夹。
即:
mkdir("/path/to/your/dir", 0700); // you can use variables here
$moveResult = move_uploaded_file(...);
代码的这一部分/upload/
建议使用完整的服务器路径语法。
move_uploaded_file( $filetmpLoc,"/upload/$logged_user/$db_file_name")
您可以使用完整的服务器路径,例如:
/var/usr/public/upload/
或如另一个答案中引用的C:/xampp/htdocs/learnphp/upload/
或相对路径:
即:
upload/
或../upload/
取决于脚本的执行位置。前者是从公共区域的根部执行的。
Nota:我不确定-416649605.jpg
是上传的实际文件名,还是连字符前缺少任何内容,或者连字符是否被添加到某处。你需要研究一下。
从我的评论中提取:
现在,如果你打算使用一个 BLOB,它可能不够大,可能必须使用 LONGBLOB https://dev.mysql.com/doc/refman/5.0/en/blob.html。
但是,当使用 BLOB 直接插入数据库时,您必须为此使用 mysqli_real_escape_string()
,否则它将不起作用;您将收到一个语法错误。
参考:
- http://php.net/manual/en/mysqli.real-escape-string.php
因此,请继续使用错误报告,直到您可以找出问题可能发生的位置。
将错误报告添加到文件顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// if using MySQL
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
// rest of your code
旁注:显示错误只能在暂存中完成,而不应在生产中完成。
此外,将or die(mysqli_error($con))
添加到$query = mysqli_query($con,$sql);
以检查数据库错误。
参考:
- http://php.net/manual/en/mysqli.error.php
附加参考:
- http://php.net/manual/en/function.file-exists.php(检查文件/文件夹是否存在(
脚注:
处于当前状态的代码可以进行 SQL 注入。使用预准备语句
引用:
- https://en.wikipedia.org/wiki/Prepared_statement
- 如何防止 PHP 中的 SQL 注入?
我相信我已经给了你足够的信息,以便为你指出正确的方向,这将和希望将引导你走向成功,干杯!
$moveResult
语句替换为以下两个语句,因为您必须将文件存储在具有特定名称的文件夹中。
$destination = "./".$_FILES['avator']['name'];
$moveResult = move_uploaded_file( $_FILES['avator']['tmp_name'],$destination);