1

所以我正在测试 w3schools 网站http://www.w3schools.com/php/php_file_upload.asp上的 move_uploaded_file() php 脚本。这是我的代码。

if ($_FILES["file"]["size"] < 2000000)
{
    if ($_FILES["file"]["error"] > 0)
        echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    else
    {
        echo "Upload: " . $_FILES["file"]["name"] . "<br />";
        echo "Type: " . $_FILES["file"]["type"] . "<br />";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

        if (file_exists("/var/www/upload/" . $_FILES["file"]["name"]))
        {
          echo $_FILES["file"]["name"] . " already exists. ";
        }
        elseif(move_uploaded_file($_FILES["file"]["tmp_name"], "/var/www/upload/".$fileName))
            echo "Stored in: " . "/var/www/upload/".$fileName;
    }
}
else
    echo "Invalid file";

问题是一直if(move_uploaded_file($_FILES["file"]["tmp_name"],"/var/www/upload/".$fileName))返回 false 但似乎文件存储在tmp服务器上的文件夹中(例如:)/tmp/php8rrKoW。当我检查tmp文件夹时,文件不存在。(它应该在脚本完成执行后被删除。)我也没有看到该/php8rrkoW文件夹​​。我不确定它是否应该在那里。tmp我将文件夹和using的权限都设置了/var/www/upload/,但我不确定是否应该将所有者设置为. 所以我想知道为什么文件没有被复制到,以及是否有办法对此进行测试。777chmodapache/var/www/upload

4

4 回答 4

1

这是我前几天为另一个问题做的一个基本的图像上传类,使用简单,也许你觉得它很有趣。

<?php 
error_reporting(E_ALL); //Will help you debug a [server/path/permission] issue
Class uploadHandler{
    public $upload_path;
    public $full_path;
    public $name;
    public $size;
    public $ext;
    public $output;
    public $input;
    public $prefix;
    private $allowed;

    function upload(){
        if($_SERVER['REQUEST_METHOD'] == 'POST'){
            if(isset($_FILES[$this->input]['error'])){
                if($_FILES[$this->input]['error'] == 0){
                    $this->name      = basename($_FILES[$this->input]['name']);
                    $file_p          = explode('.', $this->name);
                    $this->ext       = end($file_p);
                    $this->full_path = rtrim($this->upload_path,'/').'/'.preg_replace('/[^a-zA-Z0-9.-]/s', '_', $this->prefix.'_'.$file_p[0]).'.'.$this->ext;
                    $info            = getimagesize($_FILES[$this->input]['tmp_name']);
                    $this->size      = filesize($_FILES[$this->input]['tmp_name']);

                    if($info[0]>$this->allowed['dimensions']['width'] || $info[1] > $this->allowed['dimensions']['height']){
                        $this->output = 'File dimensions too large!';
                    }else{
                        if($info[0] > 0 && $info[1] > 0 && in_array($info['mime'],$this->allowed['types'])){
                            move_uploaded_file($_FILES[$this->input]['tmp_name'],$this->full_path);
                            $this->output = 'Upload success!';
                        }else{
                            $this->output = 'File not supported!';
                        }
                    }
                }else{
                    if($_FILES[$this->input]['error']==1){$this->output = 'The uploaded file exceeds the upload_max_filesize directive!';}
                    if($_FILES[$this->input]['error']==2){$this->output = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in our HTML form!';}
                    if($_FILES[$this->input]['error']==3){$this->output = 'The uploaded file was only partially uploaded!';}
                    if($_FILES[$this->input]['error']==4){$this->output = 'No file was uploaded!';}
                    if($_FILES[$this->input]['error']==6){$this->output = 'Missing a temporary folder!';}
                    if($_FILES[$this->input]['error']==7){$this->output = 'Failed to write uploaded file to disk!';}
                    if($_FILES[$this->input]['error']==8){$this->output = 'A PHP extension stopped the file upload!';}
                }
            }
        }
    }

    function setPath($var){
        $this->upload_path = $var;
    }
    function setAllowed($var=array()){
        $this->allowed = $var;
    }
    function setFilePrefix($var){
        $this->prefix = preg_replace('/[^a-zA-Z0-9.-]/s', '_', $var);
    }
    function setInput($var){
        $this->input = $var;
    }

}



//Start class
$upload = new uploadHandler();
//Set path
$upload->setPath('./');
//Prefix the file name
$upload->setFilePrefix('user_uploads');
//Allowed types
$upload->setAllowed(array('dimensions'=>array('width'=>200,'height'=>200),
                          'types'=>array('image/png','image/jpg','image/gif')));
//form property name                   
$upload->setInput('myfile');
//Do upload
$upload->upload();


//notice
if(isset($upload->output)){
    echo $upload->output;
}
?>

<form action="" method="POST" enctype="multipart/form-data">
     <!--1 MB = 1048576 bytes-->
     <input type="hidden" name="MAX_FILE_SIZE" value="1048000" />

     <p>Upload your image:<input type="file" name="myfile"><input type="submit" value="Upload"></p>

</form>
于 2012-04-24T04:55:09.540 回答
0

您要将文件移动到的目标目录应该可由网络服务器用户写入。也不要忘记一些网络服务器在 changeroot 内运行,因此可能不需要部分目标路径。PHP 帮助文档还说您应该检查 HTLM 表单以确保它是 enctype='multipart/form-data'。

最后: $filename 在哪里定义?

于 2012-04-24T05:31:50.367 回答
0

看来您应该使用 ./upload/ 而不是 /var/www/upload/ 因为您已经在可访问网站的主目录中。

您也可以参考http://www.tizag.com/phpT/fileupload.php 或 API: http: //php.net/manual/en/function.move-uploaded-file.php

让我知道这是否有效

于 2012-04-24T04:36:49.203 回答
0

您的路径必须包含“/home/usr-name”

尝试将 '/home/your-username' 添加到 '/var/www/upload' 的开头。

要了解一下,请将 info.php 添加到您的根目录中,在浏览器中打开它并查看“加载的配置文件”。

于 2016-06-26T19:22:56.450 回答