PHP文件上传问题 - 无法移动上传的文件

时间:2015-10-31 13:19:49

标签: php file-upload

我正在尝试将图像上传到数据库并收到此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}}

请任何帮助都会非常感激。

3 个答案:

答案 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);