Hướng dẫn php file upload doesn t work - tải lên tệp php không hoạt động

Tôi đã sao chép mã từ trang này: http://www.w3schools.com/php/php_file_upload.asp

Vấn đề là tôi không gặp lỗi khi tải lên tệp, thay vào đó, điều này hiển thị điều nào là chính xác:

Tải lên: hình ảnh.jpeg Loại: Hình ảnh/kích thước JPEG: 5.8603515625 KB Tệp tạm thời:/TMP/PHPZ67YXK được lưu trữ trong: tải lên/hình ảnh.jpeg

Nhưng không có tệp nào được lưu trên máy chủ.

Tôi không biết điều gì là sai nhưng tôi đang nghĩ về sự cho phép, vẫn có một thư mục có tên tải lên với 777 quyền.

Các PHP-Files này được lưu trữ trên một máy chủ web trực tuyến vì vậy tôi không chạy địa phương này.

HTML-Form


upload_file.php

 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "
"; } else { echo "Upload: " . $_FILES["file"]["name"] . "
"; echo "Type: " . $_FILES["file"]["type"] . "
"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB
"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "
"; if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; } ?>

Hướng dẫn khắc phục sự cố này & NBSP; sẽ giúp bạn tìm ra lý do tại sao mẫu tải lên PHP của bạn không hoạt động. Trong một số trường hợp, bạn có thể thấy rằng mảng $ _Files hoàn toàn trống, mặc dù thực tế là & nbsp; một tệp đã được chọn và tải lên.$_FILES array is completely empty, despite the fact that a file has been selected and uploaded.

Tải lên tập lệnh gỡ lỗi.

Nếu bạn đang tìm kiếm một câu trả lời nhanh chóng và dễ dàng, hãy thử đặt mã sau ở đầu tập lệnh tải lên của bạn:

/**
 * Check to see if POST was used and that its content length is less than the value in post_max_size
 */
$requestType = $_SERVER['REQUEST_METHOD'];
if($requestType != 'POST'){
    echo 'Request type was ' . $requestType . ' - File uploads will only work with POST. Are you using method="post" in your form element?
'; exit; } else{ if(isset($_SERVER['CONTENT_TYPE'])){ $contentType = strtolower($_SERVER['CONTENT_TYPE']); if(!stristr($contentType, 'multipart/form-data')){ echo 'Could not find multipart/form-data in Content-Type. Did you use enctype="multipart/form-data" in your form element?
'; } } if(isset($_SERVER['CONTENT_LENGTH'])){ $postSize = $_SERVER['CONTENT_LENGTH']; $maxPostSize = ini_get('post_max_size'); if($maxPostSize == 0){ echo 'post_max_size is set to 0 - unlimited.
'; } else{ if(strlen($maxPostSize) > 1){ $lastChar = substr($maxPostSize, -1); $maxPostSize = substr($maxPostSize, 0, -1); if($lastChar == 'G'){ $maxPostSize = $maxPostSize * 1024 * 1024 * 1024; } if($lastChar == 'M'){ $maxPostSize = $maxPostSize * 1024 * 1024; } if($lastChar == 'K'){ $maxPostSize = $maxPostSize * 1024; } if($postSize > $maxPostSize){ echo 'The size of the POST request (' . $postSize . ' bytes) exceeded the limit of post_max_size (' . $maxPostSize . ' bytes) in your php.ini file
'; exit; } } else{ if($postSize > $maxPostSize){ echo 'The size of the POST request (' . $postSize . ' bytes) exceeded the limit of post_max_size (' . $maxPostSize . ' bytes) in your php.ini file
'; exit; } } } } else{ echo 'CONTENT_LENGTH not found. Make sure that your POST request is smaller than the ' . ini_get('post_max_size') . ' post_max_size in php.ini
'; } } $tempFolder = ini_get('upload_tmp_dir'); if(strlen(trim($tempFolder)) == 0){ echo 'upload_tmp_dir was blank. No temporary upload directory has been set in php.ini
'; exit; } else{ echo 'upload_tmp_dir is set to: ' . $tempFolder . '
'; } if(!is_dir($tempFolder)){ echo 'The temp upload directory specified in upload_tmp_dir does not exist: ' . $tempFolder . '
'; exit; } else{ echo $tempFolder . ' is a valid directory
'; } if(!is_writable($tempFolder)){ echo 'The temp upload directory specified in upload_tmp_dir is not writeable: ' . $tempFolder . '
'; echo 'Does PHP have permission to write to this directory?
'; exit; } else{ echo $tempFolder . ' is writeable
'; } $write = file_put_contents($tempFolder . '/' . uniqid(). '.tmp', 'test'); if($write === false){ echo 'PHP could not create a file in ' . $tempFolder . '
'; exit; } else{ echo 'PHP successfully created a test file in: ' . $tempFolder . '
'; } if(ini_get('file_uploads') == 1){ echo 'The file_uploads directive in php.ini is set to 1, which means that your PHP configuration allows file uploads
'; } else{ echo 'The file_uploads directive in php.ini has been set to 0 - Uploads are disabled on this PHP configuration.
'; exit; } if(empty($_FILES)){ echo 'The $_FILES array is empty. Is your form using method="post" and enctype="multipart/form-data"? Did the size of the file exceed the post_max_size in PHP.ini?'; exit; } else{ foreach($_FILES as $file){ if($file['error'] !== 0){ echo 'There was an error uploading ' . $file['name'] . '
'; switch($file['error']){ case 1: echo 'Size exceeds the upload_max_filesize directive in php.ini
'; break; case 2: echo 'Size exceeds the MAX_FILE_SIZE field in your HTML form
'; break; case 3: echo 'File was only partially uploaded
'; break; case 4: echo 'No file was selected by the user
'; break; case 6: echo 'PHP could not find the temporary upload folder
'; break; case 7: echo 'PHP failed to write to disk. Possible permissions issue?
'; break; case 8: echo 'A PHP extension prevented the file from being uploaded.
'; break; default: echo 'An unknown error occured: ' . $file['error'] . '
'; break; } } else{ echo $file['name'] . ' was successfully uploaded to ' . $file['tmp_name'] . '
'; } } }

PHP ở trên sẽ cố gắng phát hiện một số vấn đề phổ biến nhất mà mọi người gặp phải với các hình thức tải lên. Hy vọng, nó sẽ chỉ cho bạn đi đúng hướng!

Enctype

Điều đầu tiên bạn nên làm là đảm bảo rằng bạn đã đặt thuộc tính Enctype chính xác trên phần tử biểu mẫu của bạn. Thuộc tính này về cơ bản cho máy chủ biết cách dữ liệu biểu mẫu đến.enctype attribute on your form element. This attribute basically tells the server how the incoming form data should be encoded. If you forgot to add enctype to your form, no file will be uploaded and the $_FILES array will remain empty:

Select File:

Trong trường hợp cụ thể này, chúng tôi đã đặt & nbsp; enctype thành Multipart/form-data, thay vì ứng dụng mặc định/X-www-form-urlencoded. Cài đặt Enctype thành & NBSP;“multipart/form-data” instead of the default “application/x-www-form-urlencoded”. Setting enctype to “multipart/form-data” prevents data from being encoded.

Sử dụng bài đăng, như GET không tải lên hỗ trợ.

Bạn sẽ cần đảm bảo rằng biểu mẫu HTML của bạn đã đặt thuộc tính phương thức thành Post Post, vì các tải lên tệp được hỗ trợ trong các yêu cầu GET (xem mã trên để biết ví dụ về bài đăng trên mạng được đặt làm phương thức biểu mẫu). Nếu thuộc tính phương thức trong biểu mẫu của bạn không được đặt, thì biểu mẫu sẽ gửi yêu cầu nhận theo mặc định.method attribute to “POST”, as file uploads are supported in GET requests (see the above code for an example of “POST” being set as the form method). If the method attribute in your form is not set, then the form will send a GET request by default.

Kiểm tra cấu hình PHP File_uploads của bạn.

Trong tệp cấu hình php.ini của bạn, bạn sẽ tìm thấy một chỉ thị có tên File_upLoads. Chỉ thị này chỉ định liệu PHP có cho phép tải lên HTTP hay không. Trong & nbsp; Cài đặt PHP mặc định, điều này được đưa ra giá trị 1 1, được boolean cho true - có nghĩa là tải lên tệp được cho phép theo mặc định. Tuy nhiên, nếu máy chủ web của bạn đã vô hiệu hóa tải lên tệp, thì bạn có thể thấy rằng chỉ thị này đã được đặt thành từ 0 0. Để kiểm tra giá trị của chỉ thị này, bạn chỉ cần kiểm tra tệp php.ini của mình. Nếu bạn không có quyền truy cập vào tệp php.ini, thì bạn có thể sử dụng mã sau:file_uploads. This directive specifies whether PHP should allow HTTP uploads or not. In default PHP installations, this is given the value “1”, which is BOOLEAN for TRUE – meaning file uploads are allowed by default. However, if your web host has disabled file uploads, then you may find that this directive has been set to “0”. To check the value of this directive, you can simply check your PHP.ini file. If you do not have access to the PHP.ini file, then you can use the following code:

Kiểm tra post_max_size và & nbsp; upload_max_filesize cài đặt của bạn.

Đây là hai chỉ thị php.ini có khả năng ngăn chặn mẫu tải lên của bạn hoạt động.

  • upload_max_filesize: & nbsp; upload_max_filesize Chỉ thị Chỉ định kích thước tối đa của một tệp có thể được & NBSP; được tải lên máy chủ. Theo mặc định, điều này được đặt thành 2M 2M - có nghĩa là 2MB. Nếu một tệp lớn hơn giá trị của chỉ thị này, nó sẽ không được tải lên. Trước đây, tôi đã thấy điều này gây ra 500 lỗi máy chủ nội bộ!: The upload_max_filesize directive specifies the maximum size of a file that can be uploaded to the server. By default, this is set to “2M” – meaning 2MB. If a file is larger than the value of this directive, it will not be uploaded. In the past, I have seen this causing 500 Internal Server Errors!
  • POST_MAX_SIZE: Chỉ thị này đặt & nbsp; kích thước tối đa của dữ liệu bài đăng có thể được gửi đến máy chủ. Theo mặc định, nó được đặt thành 8M 8M. Điều này có nghĩa là tất cả dữ liệu bài đăng phải có kích thước 8MB hoặc ít hơn. Nếu tệp mà bạn đang tải lên có kích thước 9MB, thì nó sẽ bị máy chủ loại bỏ.: This directive sets the maximum size of post data that can be submitted to the server. By default, it is set to “8M”. This means that all POST data must be 8MB in size or less. If the file that you are uploading is 9MB in size, then it will be discarded by the server.

Lưu ý rằng chỉ thị post_max_size phải luôn lớn hơn so với upload_max_filesize, vì nó chỉ định kích thước tối đa của cả dữ liệu bài đăng mẫu thông thường và & nbsp; dữ liệu tệp được tải lên.post_max_size directive should always be larger than upload_max_filesize, as it specifies the max size of both regular form POST data AND the uploaded file data.

Khi bạn đang thiết lập các giá trị cho các chỉ thị này, hãy đảm bảo rằng bạn sử dụng một Mùi MB - không phải là MB MB. tức là nếu bạn muốn tải lên_max_filesize của mình là 80MB, thì bạn sẽ cần sử dụng 80m 80m, chứ không phải là 80MB. Nếu bạn bỏ qua ký tự M M M và sử dụng số nguyên, thì PHP sẽ diễn giải & nbsp; giá trị là byte.

Thư mục tạm thời & nbsp; không thể viết?

Nếu bạn đã đạt được phần này của hướng dẫn khắc phục sự cố, thì thật công bằng khi nói rằng điều gì đó buồn cười đang diễn ra. Cổng tiếp theo của cuộc gọi là kiểm tra xem thư mục tạm thời máy chủ của bạn có thể ghi không (nghĩa là nó tồn tại và rằng & nbsp; máy chủ web có quyền lưu tệp vào & nbsp; nó). Khi một tệp được tải lên máy chủ, nó sẽ được lưu tự động vào thư mục tạm thời cho đến khi bạn chọn di chuyển nó. Thư mục này được đặt trong tệp php.ini trong Chỉ thị & nbsp; upload_tmp_dir.upload_tmp_dir.

Hãy xem phần sau của mã PHP sau đây, cố gắng kiểm tra xem thư mục upload_tmp_dir có khả dụng không:upload_tmp_dir directory is available:

//Check to see if the temporary folder
//is writable.

$tempFolder = ini_get('upload_tmp_dir');

echo 'Your upload_tmp_dir directive has been set to: "' . $tempFolder . '"
'; //Firstly, lets make sure that the upload_tmp_dir //actually exists. if(!is_dir($tempFolder)){ throw new Exception($tempFolder . ' does not exist!'); } else{ echo 'The directory "' . $tempFolder . '" does exist.
'; } if(!is_writable($tempFolder)){ throw new Exception($tempFolder . ' is not writable!'); } else{ echo 'The directory "' . $tempFolder . '" is writable. All is good.
'; }

Nếu bạn chạy mã ở trên và không có ngoại lệ nào được ném, thì thật công bằng khi nói rằng vấn đề này không phải là với thư mục & nbsp của bạn; upload_tmp_dir.

Mảng $ _files có trống không?

Trong tập lệnh xử lý các tệp đã tải lên của bạn, do & nbsp; một var_dump trên mảng $ _files như vậy:

Mảng $ _files có trống không? Nếu đó không phải là & nbsp; - thì các tệp đang được tải lên thư mục tạm thời trên máy chủ & nbsp của bạn. Nếu mảng $ _files trống, thì bạn có thể đã làm rối tung một trong những cạm bẫy được liệt kê ở trên.

Bật lỗi PHP.

Ở giai đoạn này, tôi nghĩ rằng đó là một ý tưởng tốt để kích hoạt báo cáo lỗi PHP, để chúng ta có thể thấy những gì đang thực sự xảy ra. Có thể bạn đang nhận được một trang trống hoặc có thể máy chủ đang phản hồi với trang Lỗi 500 máy chủ nội bộ không có ích.

Nếu các tệp đang được tải lên nhưng chúng không được chuyển sang thư mục có liên quan, thì có lẽ là do đường dẫn tệp không tồn tại (lỗi chính tả) hoặc các quyền chính xác chưa được đặt. Để xem những gì thực sự đi sai, hãy thử đặt đoạn mã sau ở đầu tập lệnh tải lên của bạn:

Hy vọng rằng, hướng dẫn khắc phục sự cố này đã giúp bạn sửa chữa mẫu tải lên PHP của bạn - hoặc ít nhất, nó chỉ cho bạn đi đúng hướng.

Làm cách nào để cho phép PHP tải lên các tệp?

Tải lên tệp PHP..
Định cấu hình tệp "php.ini". Đầu tiên, đảm bảo rằng PHP được cấu hình để cho phép tải lên tệp. ....
Kiểm tra nếu tệp đã tồn tại. Bây giờ chúng ta có thể thêm một số hạn chế. ....
Giới hạn kích thước tệp. Trường đầu vào tệp trong biểu mẫu HTML của chúng tôi ở trên được đặt tên là "Filetoupload". ....
Giới hạn loại tệp. ....
Hoàn thành Tải lên Tập lệnh Php ..

Làm thế nào để kiểm tra lỗi tải lên tệp trong PHP?

PHP trả về một mã lỗi thích hợp cùng với mảng tệp.Mã lỗi có thể được tìm thấy trong phân đoạn lỗi của mảng tệp được tạo trong quá trình tải lên tệp bởi PHP.Nói cách khác, lỗi có thể được tìm thấy trong $ _files ['userFile'] ['error'].Giá trị: 0;Không có lỗi, tập tin được tải lên với thành công.$_FILES['userfile']['error'] . Value: 0; There is no error, the file uploaded with success.

Các tệp $ _ trong PHP là gì?

PHP $ _FILES Biến được xác định trước toàn cầu $ _Files là một mảng kết hợp có chứa các mục được tải lên qua phương thức bài HTTP.Tải lên một tệp yêu cầu biểu mẫu phương thức bài HTTP với thuộc tính Enctype được đặt thành nhiều dữ liệu/hình thức.an associative array containing items uploaded via HTTP POST method. Uploading a file requires HTTP POST method form with enctype attribute set to multipart/form-data.

FILE MOVE_ ĐÁNH GIÁ_ Tệp làm gì trong PHP?

Định nghĩa và sử dụng hàm Move_uploaded_file () di chuyển một tệp đã tải lên một đích mới.Lưu ý: Chức năng này chỉ hoạt động trên các tệp được tải lên thông qua cơ chế tải lên bài HTTP của PHP.Lưu ý: Nếu tệp đích đã tồn tại, nó sẽ bị ghi đè.moves an uploaded file to a new destination. Note: This function only works on files uploaded via PHP's HTTP POST upload mechanism. Note: If the destination file already exists, it will be overwritten.