簡體   English   中英

move_uploaded_file 給出“無法打開流:權限被拒絕”錯誤

[英]move_uploaded_file gives "failed to open stream: Permission denied" error

嘗試在 CentOS 上使用 Apache 2.2 和 PHP 5.3 配置上傳目錄時,我不斷收到此錯誤。

在 php.ini 中:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

在 httpd.conf 中:

Directory /var/www/html/mysite/tmp_file_upload/>
    Options  -Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
                Options -Indexes
</Directory>

CentOS 目錄權限:

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

無論我做什么,當我上傳文件時,我總是從 PHP 收到此錯誤:

警告:move_uploaded_file(images/robot.jpg):無法打開流:第 78 行的 /var/www/html/mysite/process.php 中的權限被拒絕

警告:move_uploaded_file(): 無法將 '/tmp/phpsKD2Qm' 移動到第 78 行 /var/www/html/mysite/process.php 中的 'images/robot.jpg'

如您所見,它從未從 php.ini 文件中獲取有關上傳文件的配置。

我在這里做錯了什么?

這是因為imagestmp_file_upload只能由root用戶寫入。 為了上傳工作,我們需要使這些文件夾的所有者與 httpd 進程所有者相同,或者使它們全局可寫(不好的做法)。

  1. 檢查 apache 進程所有者: $ps aux | grep httpd $ps aux | grep httpd 第一列將是所有者,通常不會是nobody
  2. imagestmp_file_upload的所有者更改為nobody或您在步驟 1 中找到的任何所有者。

     $sudo chown nobody /var/www/html/mysite/images/ $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. 如果需要,Chmod imagestmp_file_upload現在可由所有者寫入 [似乎您已經有了它]。 在@Dmitry Teplyakov 的回答中提到。

     $ sudo chmod -R 0755 /var/www/html/mysite/images/ $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. 有關為什么會發生這種行為的更多詳細信息,請查看手冊http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir ,注意它也討論了open_basedir指令。

您還可以運行此腳本來找出 Apache 進程所有者:

<?php echo exec('whoami'); ?>

然后將目標目錄的所有者更改為您所擁有的。 使用命令:

chown user destination_dir

然后使用命令

chmod 755 destination_dir

更改目標目錄權限。

這對我有用。

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

然后注銷或重新啟動。

如果SELinux報錯,請嘗試以下操作

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'

如果您使用的是 Mac OS X,請轉到文件根目錄或您網站的文件夾。

然后右鍵單擊它,轉到獲取信息,轉到最底部(共享和權限),打開它,將所有只讀更改為讀寫。 確保打開掛鎖,轉到設置圖標,然后選擇應用到所附項目...

我想將此添加到以前的建議中。 如果您使用的是啟用了SELinux的 Linux 版本,那么您還應該在 shell 中執行此操作:

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory

通過組或更改目錄所有者來授予您的 Web 服務器用戶權限。

更改此文件夾的權限

# chmod -R 0755 /var/www/html/mysite/images/

嘗試這個:

  1. 打開 /etc/apache2/envvars

     sudo gedit /etc/apache2/envvars
  2. your_username替換www-data

     "export APACHE_RUN_USER=www-data"

    用。。。來代替

    export APACHE_RUN_USER='your_username'

即使已經成功運行了composer,我也遇到了這個相關的問題。 我更新了 composer,當運行composer installphp composer.phar install我得到了:

...無法打開流:權限被拒絕...

經過大量研究后發現,先前有關更改文件夾權限的答案有效。 它們現在只是略有不同的目錄。

在我的安裝中,在 OS X 上,緩存文件位於/Users/[USER]/.composer/cache ,我遇到了麻煩,因為緩存文件歸 root 所有。 將“.composer”的所有權以遞歸方式更改給我的用戶解決了該問題。

這就是我所做的:

sudo chown -R [USER] cache

然后我再次運行 composer install ,瞧!

當 apache 用戶 (www-data) 沒有權限在文件夾中寫入時,會發生此問題。 要解決此問題,您需要將用戶放入 www-data 組中。

我剛做了這個:

執行這段php代碼<?php echo exec('whoami'); ?> <?php echo exec('whoami'); ?>發現 apache 使用的用戶。 之后,在終端中執行命令:

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

它將返回如下內容:

total of files

drwxr-xr-x 7 user group size date folder

我保留了用戶,但將組更改為 www-data

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername

解決方法很簡單。 只需右鍵單擊 IMAGE (destination) 文件夾,轉到屬性,單擊權限選項卡,將其他人的訪問權限更改為Create and delete files

把tmp_file_upload的權限改成755下面是chmod -R 755 tmp_file_upload命令

嘗試這個

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664

如果啟用了SELinux ,就會發生這種情況。 通過設置SELINUX=disabled/etc/selinux/config SELINUX=disabled並重新啟動服務器。

我已經嘗試了上述所有解決方案,但以下解決了我的問題

chcon -R -t httpd_sys_rw_content_t your_file_directory

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM