我正在尝试将图像上传到数据库并收到此PHP错误消息:
警告:move_uploaded_file(/upload/efc5ad334bca9f31b19d85a6cc2ada57/-416649605.jpg):无法打开流:第51行的C:\ xampp \ htdocs \ learnphp \ gettingstarted.php中没有此类文件或目录
警告:move_uploaded_file():无法在C:\ xampp \ htdocs \ learnphp \ gettingstarted.php中将'C:\ xampp \ tmp \ phpA9E6.tmp'移动到'/upload/efc5ad334bca9f31b19d85a6cc2ada57/-416649605.jpg'第51行 上传失败。
这是我的php脚本:
<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>
我的HTML代码是:
{{1}}
请任何帮助都会非常感激。
答案 0 :(得分:1)
您在上传时收到错误的原因是该文件夹本身不存在;至少这是我从中得到的印象,说实话,我们不知道efc5ad334bca9f31b19d85a6cc2ada57
是否存在。
旁注:使用此答案中进一步引用的file_exists()
。
$logged_user
的会话作为用户名会话数组,因此请确保使用会话在所有文件中启动会话。 session_start();
必须位于所有文件中,并位于代码顶部。最好检查会话是否也使用isset()
或!empty()
进行设置。
参考文献:
如果不是(非常确定没有),您首先需要使用mkdir()
函数创建它。
语法为:mkdir("/path/to/my/dir", 0700);
- 0700
可以更改为0755
这是文件夹的常用设置,必须设置它才能使用chmod写入文件夹
语法是手册中列出的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直接插入db时,你必须使用mysqli_real_escape_string()
,否则它将无效;你会收到一个语法错误。
参考:
因此,继续使用错误报告,直到找出可能出现问题的位置。
将error reporting添加到文件的顶部,这有助于查找错误。
<?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);
以检查数据库错误。
参考:
补充参考:
<强>脚注:强>
处于当前状态的代码对SQL注入是开放的。使用准备好的声明
参考文献:
我相信我已经为您提供了足够的信息,以便为您指明正确的方向,希望能带您走向成功,欢呼!
答案 1 :(得分:0)
PHP尝试将您上传的文件移动到不存在的文件夹:
//move uploaded avator
$moveResult = move_uploaded_file( $filetmpLoc,"/upload/$logged_user/$db_file_name");
路径“/ upload”看起来不像正确的Windows路径。将其更改为“C:\ xampp \ htdocs \ learnphp \ upload”之类的内容。如果该文件夹不存在,请手动创建该文件夹。
//move uploaded avator
$moveResult = move_uploaded_file( $filetmpLoc,"C:/xampp/htdocs/learnphp/upload/$logged_user/$db_file_name");
答案 2 :(得分:0)
将$moveResult
语句替换为以下两个语句,因为您必须将文件存储在具有特定名称的文件夹中。
$destination = "./".$_FILES['avator']['name'];
$moveResult = move_uploaded_file( $_FILES['avator']['tmp_name'],$destination);