繁体   English   中英

为什么我的PHP文件上传代码不起作用?

[英]Why is my PHP file upload code not working?

我正在尝试使用PHP制作一个简单的文件上传表单。 这是我的代码:

<?php
    $uploads_dir = '/uploads';

    if(isset($_FILES['thefile'])){
      $errors= array();
      $file_name = $_FILES['thefile']['name'];
      $file_size =$_FILES['thefile']['size'];
      $file_tmp =$_FILES['thefile']['tmp_name'];
      $file_type=$_FILES['thefile']['type'];
      $tmp_name = $_FILES['thefile']["tmp_name"];

      if($file_size > 2097152){
         $errors[]='File size must be less than 2 MB';
      }
      if(empty($errors)==true){
         move_uploaded_file($tmp_name, "$uploads_dir/$file_name");
         echo "Success";
      }
      else{
         print_r($errors);
      }
   }
?>
<!DOCTYPE html>
<html>
<head>
    <title>Simple File Upload</title>
</head>
<body>

<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="thefile" />
    <input type="submit"/>
</form>

</body>
</html>

我意识到我并没有限制文件类型,但是一旦我可以上传一个简单的.jpg或.zip文件,我就会担心。 使用上面的代码,我转到位于以下位置的本地服务器上的页面:

C:\wamp\www\simpleupload  (this contains index.php, the file posted above)

当我选择一个小的图像文件并单击提交时,出现以下错误:

警告:move_uploaded_file(/uploads/session_timeout_formatting_bug.png):无法打开流:第18行的C:\\ wamp \\ www \\ project_fileshare \\ index.php中没有此类文件或目录

警告:move_uploaded_file():无法在第18行的C:\\ wamp \\ www \\ project_fileshare \\ index.php中将'C:\\ wamp \\ tmp \\ phpEFDE.tmp'移动到'/uploads/session_timeout_formatting_bug.png'

第18行是调用move_uploaded_file()函数的行。

如何解决此错误? 我有一个'uploads_dir'文件夹,位于与index.php文件相同的文件夹中。 (请参考上面的文件路径)。 我在这里做错了什么? 我一定会误解此过程的一小部分,并将目录放在错误的位置,否则我在代码中做错了什么。

有人可以发现我的错误并告诉我该怎么做才能解决它?

您正在Windows上工作,并且已经告诉PHP无法访问的位置(即/uploads linux路径)。

由于您在Windows中工作,并且文档根目录为C:\\wamp\\www\\simpleupload

也就是说,您的文件位于以下位置:

  • C:\\wamp\\www\\simpleupload\\index.php (您的上传脚本)
  • C:\\wamp\\www\\simpleupload\\uploads (文件应上传到的位置)

为什么不使用这样的绝对路径:

$uploads_dir = getcwd() . DIRECTORY_SEPARATOR . 'uploads';

getcwd()函数将返回正在执行的PHP脚本的当前工作目录(在您的情况下为index.php),因此$uploads_dir如下所示: C:\\wamp\\www\\simpleupload\\uploads

尝试这个。

如果您的上载目录与index.php位于同一位置,请删除$ uploads_dir变量中的“ /”。 这,或添加一个“。” 在斜线之前,因为现在它指的是根,而根可能是当前工作目录之外的其他名称。 说到魔鬼; http://php.net/manual/zh/function.getcwd.php

$uploads_dir = getcwd() . '\uploads';
$uploads_dir = __DIR__ . '\uploads'; #php > 5.6

另外,请检查您的目录是否可用于php: http : //php.net/manual/en/function.is-writable.php

还有Latheesan所说的,最好跨平台运行,因为我犯了相同的错误。

<?php
    function buildPath(...$segments){
        return join(DIRECTORY_SEPARATOR, $segments);
    }

    echo buildPath(__DIR__, 'uploads');
?>

我会改变

if(isset($_FILES['thefile'])){

为了这

if($_FILE['thefile']['error'] === UPLOAD_ERR_OK){

因为我认为这是了解用户是否上传文件或输入为空的最佳方法。

要么

if (isset($_FILE["thefile"]["name"])){

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM