php php复制功能,无法打开流:权限被拒绝

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5572251/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 21:50:12  来源:igfitidea点击:

php copy function, failed to open stream: Permission denied

phppermissionsupload

提问by eomeroff

I am trying to upload image on server, below is script that I found on Internet and in worked locally, when I deployed code and database is gives me "failed to open stream: Permission denied" error.

我正在尝试在服务器上上传图像,下面是我在 Internet 上找到并在本地工作的脚本,当我部署代码和数据库时,出现“无法打开流:权限被拒绝”错误。

<?php
//define a maxim size for the uploaded images in Kb
 define ("MAX_SIZE","5000"); 

//This function reads the extension of the file. It is used to determine if the file  is an image by checking the extension.
 function getExtension($str) {
         $i = strrpos($str,".");
         if (!$i) { return ""; }
         $l = strlen($str) - $i;
         $ext = substr($str,$i+1,$l);
         return $ext;
 }

//This variable is used as a flag. The value is initialized with 0 (meaning no error  found)  
//and it will be changed to 1 if an errro occures.  
//If the error occures the file will not be uploaded.
 $errors=0;

    //reads the name of the file the user submitted for uploading
    $image=$_FILES['image']['name'];

    //if it is not empty
    if ($image) 
    {
    //get the original name of the file from the clients machine
        $filename = stripslashes($_FILES['image']['name']);
    //get the extension of the file in a lower case format
        $extension = getExtension($filename);
        $extension = strtolower($extension);
    //if it is not a known extension, we will suppose it is an error and will not  upload the file,  
    //otherwise we will do more tests
 if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png")) 
        {
        //print error message
            echo '<h1>Nepoznata vrsta fajla!</h1>';
            $errors=1;
        }
        else
        {
//get the size of the image in bytes
 //$_FILES['image']['tmp_name'] is the temporary filename of the file
 //in which the uploaded file was stored on the server
 $size=filesize($_FILES['image']['tmp_name']);

//compare the size with the maxim size we defined and print error if bigger
if ($size > MAX_SIZE*1024)
{
    echo '<h1>To large file!</h1>';
    $errors=1;
}

//we will give an unique name, for example the time in unix time format
$image_name=time().'.'.$extension;
//the new name will be containing the full path where will be stored (images folder)
$newname="Content/Images/".$image_name;
//we verify if the image has been uploaded, and print error instead
//$copied = copy($_FILES['image']['tmp_name'], $newname);

$copied = copy('$_FILES['image']['tmp_name'], $newname);

//echo $_FILES['image']['tmp_name'].'<br/>';
//echo $_FILES['image']['name'];

if (!$copied) 
{
    echo '<h1>Error occurred!</h1>';
    $errors=1;
}}}


//If no errors registred, print the success message
 /*if(isset($_POST['Submit']) && !$errors) 
    {
    echo "<h1>You have successfully uploaded image.</h1>";
}*/

 ?>

I saw some answerers from stackoverflow like answers1and answer2but I am not sure how to do that? Is there any other suggestion?

我从 stackoverflow 看到了一些回答者,比如answers1answer2,但我不知道该怎么做?还有其他建议吗?

thanks.

谢谢。

回答by 65Fbef05

Make sure that the system user running php and executing this script has write permission for the directly where you are attempting to store the file.

确保运行 php 并执行此脚本的系统用户对您尝试存储文件的直接位置具有写入权限。

回答by Payam Naderi

The Folder You Trying To Copy Your Files Must Have Same Permission As Your PHP User.(apache user if your server is apache)

您尝试复制文件的文件夹必须与您的 PHP 用户具有相同的权限。(如果您的服务器是 apache,则为 apache 用户)

./
drwxrwxr-x root root Application
drwxrwxr-x apache apache FilesystemDir

./
drwxrwxr-x root root 应用程序
drwxrwxr-x apache apache FilesystemDir

回答by alexua

if you also can not create file in destination folder, and you already put permission on it 755 please check the following:

如果您也无法在目标文件夹中创建文件,并且您已经对其设置了 755 权限,请检查以下内容:

If your file is: /path/to/test-in.txt

如果您的文件是:/path/to/test-in.txt

You should have X permission on:

您应该在以下方面拥有 X 权限:

  • /path
  • /path/to
  • and read permission on /path/to/test-in.txt
  • /小路
  • /路径/到
  • 并读取 /path/to/test-in.txt 的权限

Check more details here fopen() fails to open stream: permission denied, yet permissions should be valid

在此处查看更多详细信息 fopen() 无法打开流:权限被拒绝,但权限应该有效

回答by Romain TAILLANDIER

Nothing of the above has solve my problem. In fact the directories, and files has the good right for user php (=='www-data'). But a

以上都没有解决我的问题。事实上,目录和文件对用户 php (=='www-data') 具有很好的权限。但是一个

dump(exec("whoami")); // returns 'another'

helps identify that php user was not the awaited one ('www-data') but was 'another'.

有助于确定 php 用户不是等待的用户(“www-data”)而是“另一个”。

Some program has edited the /etc/apache2/envvars

某些程序编辑了 /etc/apache2/envvars

export APACHE_RUN_USER=another
export APACHE_RUN_GROUP=another

Put back www-data instead,

放回 www-data 代替,

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

and restart apache has solve everything.

并重新启动 apache 已经解决了一切。

sudo service apache2 restart

Hopes that could help

希望可以帮助

回答by Marc B

Your copy command appears to have syntax errors:

您的复制命令似乎有语法错误:

$copied = copy('$_FILES['image']['tmp_name'], $newname);
               ^--- extra quote?

If you're trying to do something like

如果你正在尝试做类似的事情

$copied = copy("$_FILES['image']['tmp_name']", $newname);

it won't work anyways. PHP's parser isn't gready, and will see that as

无论如何都行不通。PHP 的解析器不成熟,并将其视为

$_FILES['image'] -> array
['tmp_name'] -> string

and try to do

并尝试做

$copied = copy("Array['tmp_name']" ....);

And in any case, you should use move_uploaded_file() to handle moving uploaded files, rather than copy(). m_u_l has extra checks to make sure no one's tampered with the file in the time between the upload completed and your script trying to move it.

在任何情况下,您都应该使用 move_uploaded_file() 来处理移动上传的文件,而不是copy(). m_u_l 有额外的检查,以确保在上传完成和您的脚本尝试移动它之间的时间内没有人篡改文件。