不能使用PHP上传文件?

时间:2014-07-10 23:41:37

标签: php html file-upload save

你能看看我的代码吗?人们可以点击上传按钮上传一些文件,代码应该将其移动到新位置并保存。我通过上传图像文件测试它,我无法在我指定的文件夹中找到该文件。我确定目录是正确的,因为我使用目录是文件夹,它可以导致我想要它的文件夹。因为下面的目录有我的名字,我用“1”代替。提前谢谢!

我根据答案更改了代码,但它仍然给我回错: 警告:move_uploaded_file(/Users/angeloliao/Documents/Screen.tiff):无法打开流:第16行/usr/local/zend/apache2/htdocs/JuvoliciousProductViewer/5.php中的权限被拒绝

警告:move_uploaded_file():无法在/ usr / local / zend / apache2 / htdocs / JuvoliciousProductViewer中将'/ usr / local / zend / tmp / phpdfCRD3'移动到'/Users/angeloliao/Documents/Screen.tiff'第16行/5.php

我尝试在终端上使用以下命令更改文件夹的权限:sudo chown -R 0755 / Users / angeloliao / Documents。它跑了。

<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
</head>
<body>
   <form enctype="multipart/form-data" method="POST">
       <input type="file" name="file" />
       <input type="submit" name="submit" value="upload" />
   </form>
   <?php
   if ($_FILES) {
       $name = $_FILES['file']['name'];
       $temp = $_FILES['file']['tmp_name'];
       $dir = "/Users/angeloliao/Documents/";
   if (move_uploaded_file($temp,$dir.$name)) {
       echo "File is valid, and was successfully uploaded.\n";
     }
     } else {
         echo "Possible file upload attack!\n";
   }
   ?>
</html>

2 个答案:

答案 0 :(得分:3)

<!DOCTYPE html>
<html>
   <head>
    <meta charset="UTF-8">
</head>
<body>
    <form enctype="multipart/form-data" method="POST">
        <input type="file" name="file" />
        <input type="submit" name="submit" value="upload" />
    </form>
    <?php
        $name = $_FILES['file']['name'];
        $temp = $_FILES['file']['tmp_name'];
        $dir = "/Users/1/Documents/";
        move_uploaded_file($temp,$dir.$name);
    ?>
</body>

应该是_ not +,目录应该是带有斜杠的“Documents /”

答案 1 :(得分:0)

根据the PHP documentation,临时名称位于$_FILES['file']['tmp_name']而不是$_FILES['file']['tmp+name']。另外,var_dump() $dir.$name。如果您上传的文件是“image.jpg”,那么它将是/Users/1/Documentsimage.jpg。注意丢失的斜线。

更改此项将使您的代码正常工作,但它仍然无法处理所有可能的错误,也不安全!上传可能会失败。如果有,您会在$_FILES['file']['error']中找到错误代码(the docs has a reference that lists them all)。在移动临时文件之前,您应该检查上传是否成功(如果表单已经提交,您也应该只执行move命令。)

此外,使用上传者提供的名称是不安全的。考虑$_FILE['file']['name']是否为../../../usr/local/bin/php。然后上传者可以用恶意可执行文件替换你的PHP解释器。这很危险!绝不相信用户输入!在这种情况下,最佳做法是随机生成一个不依赖于原始文件名的文件名(即,不要只是散列提供的文件名,因为如果两个人上传一个具有相同名称的文件会怎么样?)。

if($_POST['submit'] === 'upload') {  // only process form if it has been submitted

    if($_FILES['file']['error'] !== UPLOAD_ERR_OK) {

        exit('There was an error uploading your file');
    }

    $uploads_dir = '/Users/1/Documents/';
    $upload_name = sha1(mt_rand().microtime(true)); // you should actually pick
                                                    // something more unique
                                                    // (collisions are possible)

    move_uploaded_file($FILES['file']['tmp_name'], $uploads_dir . $upload_name);
}