[英]move_uploaded_file gives: failed to open stream: Permission denied
[英]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 文件中獲取有關上傳文件的配置。
我在這里做錯了什么?
這是因為images
和tmp_file_upload
只能由root
用戶寫入。 為了上傳工作,我們需要使這些文件夾的所有者與 httpd 進程所有者相同,或者使它們全局可寫(不好的做法)。
$ps aux | grep httpd
$ps aux | grep httpd
。 第一列將是所有者,通常不會是nobody
將images
和tmp_file_upload
的所有者更改為nobody
或您在步驟 1 中找到的任何所有者。
$sudo chown nobody /var/www/html/mysite/images/ $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
如果需要,Chmod images
和tmp_file_upload
現在可由所有者寫入 [似乎您已經有了它]。 在@Dmitry Teplyakov 的回答中提到。
$ sudo chmod -R 0755 /var/www/html/mysite/images/ $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
有關為什么會發生這種行為的更多詳細信息,請查看手冊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/
嘗試這個:
打開 /etc/apache2/envvars
sudo gedit /etc/apache2/envvars
用your_username
替換www-data
"export APACHE_RUN_USER=www-data"
用。。。來代替
export APACHE_RUN_USER='your_username'
即使已經成功運行了composer,我也遇到了這個相關的問題。 我更新了 composer,當運行composer install
或php 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.