簡體   English   中英

PHP move_uploaded_file“無法移動”

[英]PHP move_uploaded_file “Unable to move”

抱歉,如果其他地方都回答了這個問題,並且我沒有將自己與發布到move_upload_file()失敗相關聯。 move_upload_file()響應有2個錯誤,“無法打開流”和“無法移動”。 我正嘗試將其盡可能簡單,僅出於測試目的(因為它不起作用)。 這個站點不是暴露於互聯網,也不是用於生產目的,而是我的學習。 先發制人的謝謝您的耐心配合和對我遇到的麻煩的提示。

HTML表單發布:

<!DOCTYPE html>
<html>
<body>

<form enctype="multipart/form-data" action="recv.php" method="POST">
  <!-- MAX_FILE_SIZE must precede the file input field -->
  <input type="hidden" name="MAX_FILE_SIZE" value="3000000" />
  <!-- Name of input element determines name in $_FILES array -->
  Send this file: <input name="userfile" type="file" />
  <input type="submit" value="Send File" />
</form>

</body>
</html>

recv.php:

<?php
error_reporting(E_ALL);
ini_set('display_errors',1);

$uploaddir = '/var/www/html/Pictures/';
//$uploaddir = 'Pictures/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo "File: $uploadfile<br>\n";

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
  echo "File is valid, and was successfully uploaded.\n";
}

echo 'print_r($_FILES):';
print_r($_FILES);

print "</pre>";

?>

結果:

File: /var/www/html/Pictures/test.jpg

Warning:  move_uploaded_file(/var/www/html/Pictures/test.jpg): failed to open stream: Permission denied in /var/www/html/recv.php on line 13

Warning:  move_uploaded_file(): Unable to move '/tmp/phpuA2sGA' to '/var/www/html/Pictures/test.jpg' in /var/www/html/recv.php on line 13

print_r($_FILES):
Array
(
    [userfile] => Array
        (
            [name] => test.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/phpuA2sGA
            [error] => 0
            [size] => 43434
        )

)

以及相關的安全性(或缺乏安全性):

drwxrwxrwt. 8 root   root   4096 Apr 10 16:00 /tmp
drwxrwxrwt. 3 root   root     35 Apr 10 16:00 /var/tmp/
drwxrwxrwt. 2 apache apache    6 Apr 10 16:53 /var/www/html/Pictures/

我無法關聯的最重要的注釋可能是,此命令原本可以一次工作,但我已刪除了html文件夾的內容。 我注意到“圖片”中的鏈接文件指向/var/www/html 我不小心刪除了該鏈接,隨后刪除了我在/var/www/html進行測試的幾個文件。 我已經按照上述規格重建了這些文件,但是現在收到嘗試移動的警告。 如recv.php文件所示,我已經嘗試了絕對路徑和相對路徑。 我意識到很多這樣的做法都被認為與最佳實踐背道而馳,但是在解決所有其他概念之前,我需要先了解有什么不完善的地方。 如果重要的話,Getenforce仍在“執行”。

這是一個selinux許可問題。 chcon -R -t httpd_sys_rw_content_t Pictures解決了該問題。

我意識到在打印is_writable('Pictures')的結果時,不是777權限的問題,該結果最終是錯誤的。 setenforce 0之后的真正快速測試證明,我需要解決selinux。

我有類似的錯誤:

[11-Mar-2019 05:26:17 Asia/Shanghai] PHP Warning:  move_uploaded_file(uploads/my_image.jpg): failed to open stream: Permission denied in /var/www/example.com/public_html/upload.php on line 38
[11-Mar-2019 05:26:17 Asia/Shanghai] PHP Warning:  move_uploaded_file(): Unable to move '/tmp/phpOeWOf4' to 'uploads/my_image.jpg' in /var/www/example.com/public_html/upload.php on line 38

就我而言,我通過sudo chown www-data uploads解決了該問題,其中uploads是上傳目標的文件夾名稱:

$ ls -la /var/www/example.com/public_html/uploads -d
drwxr-xr-x 2 www-data root 4096 Mac  11 05:29 /var/www/example.com/public_html/uploads

暫無
暫無

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

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