2010-10-04 2 views
12

Ai đó có thể giúp tôi hiểu tại sao điều này trả về sai?move_uploaded_file thất bại

if ((move_uploaded_file($_FILES[$field]['tmp_name'], $path))) { 

Vì nguyên nhân tiềm ẩn. Tôi đã kiểm tra các biến là chính xác và tôi đã kiểm tra các quyền trên thư mục đích là 777.

Chúc mừng!

Đối với những người muốn xem var_dump ($ _FILES);

array(1) { ["image"]=> array(5) { ["name"]=> string(14) "accountile.png" 
["type"]=> string(9) "image/png" ["tmp_name"]=> string(14) "/tmp/php28IQhv" 
["error"]=> int(0) ["size"]=> int(394) } } 
+0

Suy nghĩ đầu tiên của tôi là hỏi xem trường $ có được đặt chính xác hay không, tức là bạn có đang chỉ định tên đường dẫn chính xác hay không. Sau đó tôi sẽ yêu cầu tương tự cho $ path. Hãy thử var_dumping mỗi người trong số họ. – lonesomeday

Trả lời

1

Với move_uploaded_file bạn không cần 777 quyền. Đầu ra của $path là gì? Bạn đã xác minh rằng $path có tồn tại không? Bạn đã xác minh rằng $field có tồn tại không?

Hoặc trường $ hoặc đường dẫn $ không tồn tại hoặc open_basedir có hiệu lực là phỏng đoán của tôi.

Đã bật hạn chế open_basedir? Điều đó có thể ngăn không cho đích của tệp được tải lên được ghi vào. Nhìn vào php.ini của bạn cho open_basedir, nếu có một đường dẫn được chỉ định thì nó được kích hoạt và bạn muốn xem đường dẫn đích của tệp đã tải lên của bạn có nằm trong đường dẫn này hay không. Nếu có, đó là lý do tại sao nó không thành công.

cập nhật

$ path không thể là một URL, nó phải là một con đường địa phương như /home/user/public_html/

+0

$ đường dẫn và $ mong đợi trở lại trường chuỗi. Tôi có thể đăng đầu ra gần đây nhất nếu nó giúp. – YsoL8

+0

@Yoi bạn biết rằng đường dẫn $ cần phải là tên tệp chứ không phải đường dẫn, phải không? –

+0

open_basedir không có giá trị trong phpinfo – YsoL8

0

gỡ lỗi Các bước cơ bản:

  • gì một cái nhìn print_r($_FILES) như thế nào?
  • Tệp nguồn có thực sự tồn tại không?
  • Cờ "lỗi" của tệp tải lên không (sẽ hiển thị khi thực hiện print_r)
  • Mục tiêu $path trông như thế nào?
  • Bạn có chỉ định tên tệp đầy đủ trong đường dẫn đích không?

Tôi đoán rằng $path chỉ là đường dẫn đến thư mục chứ không phải là tên tệp đầy đủ.

Cập nhật: Bạn cần chỉ định đường dẫn hệ thống tệp làm $ path.

+0

Tất cả đều giống như chúng (tôi cho rằng bạn có nghĩa là tuyệt đối đường dẫn đích) – YsoL8

+0

@ YsoL8 '$ path' cần phải là tên tệp đầy đủ chưa tồn tại, không chỉ là đường dẫn đến thư mục. –

+0

$ path = http://www.barbadostravelbuddy.co.uk/demo/images/carhire/accountile10420103260403000000pm.png gần đây nhất – YsoL8

1

Bạn có kiểm tra quyền trên thư mục tải lên tạm thời không?

gì php cho bạn biết nếu bạn làm:

var_dump($_FILES); 
1

Không sử dụng

$path = "http://www.barbadostravelbuddy.co.uk/demo/images/carhire 
    /accountile10420103260403000000pm.png" 

nhưng

$path = "/home/sites/barbadostravelbuddy.co.uk/public_html/demo/images/carhire/ 
    accountile10420103260403000000pm.png" 

Nó cần phải là một đường dẫn trên hệ thống, không một URL.

+0

Tôi đã thử/public_html/demo/images/carhire chưa hoạt động. Cấu trúc thư mục của tôi là root> public_html> demo> images> carhire – YsoL8

+0

Ok. Hãy thử làm một mkdir (http://php.net/manual/en/function.mkdir.php) trong thư mục đó. Điều đó sẽ kiểm tra xem thư mục có đúng không và bạn có quyền trên đó không. –

+0

Xin lỗi nhưng điều đó đã không làm việc – YsoL8

21

Tôi đã kiểm tra các biến

Không kiểm tra biến nhưng thông báo lỗi kiểm tra.
Đó là điều duy nhất bạn cần.
Thêm những dòng này ở phía trên cùng của mã của bạn

ini_set('display_errors',1); 
error_reporting(E_ALL); 

và xem những gì nó nói.
Nếu move_uploaded_file không thành công, nó sẽ luôn báo lỗi với giải thích chi tiết.
Bạn sẽ không tin điều đó, nhưng đọc các thông báo lỗi là cách cách hiệu quả hơn để tìm thấy một vấn đề hơn phỏng đoán bạn đã cố gắng trước

Tôi không thể tin không ai đề cập đến nó rồi.

+0

Điều cần biết, tôi chưa bao giờ gặp vấn đề với move_uploaded_file vì vậy tôi chưa bao giờ cần biết. – Webnet

+1

Lỗi/thất bại khi 'move_uploaded_file()' rất có thể gây ra bởi sự cố về quyền trong thư mục/thư mục đích. Và có, bạn có thể thấy các thông báo lỗi với câu trả lời này để kiểm tra các thông báo lỗi thay vì kiểm tra các biến lỗi. – Aryo

+0

Ông cảm giác thông thường, cảm ơn bạn. – Andrew

1

Bạn đã chỉnh sửa php.ini của mình để đảm bảo upload_tmp_dir trỏ đến một thư mục tạm thời?

1

Loïc Février, cảm ơn bạn, bạn đã dành cho tôi rất nhiều thời gian!

Đây là phần của tôi ... in lỗi có thể xảy ra khi tải lên.

Đầu tiên tạo thư mục tải lên/UploadedFiles Sau đó sử dụng đoạn mã sau ...

$destination=$_SERVER[DOCUMENT_ROOT]."/Uploader/UploadedFiles/" . $_FILES["file"]["name"]; 

if(move_uploaded_file($_FILES["file"]["tmp_name"], $destination)){ 
    echo ("Stored in".$_SERVER[DOCUMENT_ROOT]."/Uploader/UploadedFiles/".$_FILES["file"]["name"]); 
}else{ 
    $html_body = '<h1>File upload error!</h1>'; 
    switch ($_FILES[0]['error']) { 
    case 1: 
     $html_body .= 'The file is bigger than this PHP installation allows'; 
     break; 
    case 2: 
     $html_body .= 'The file is bigger than this form allows'; 
     break; 
    case 3: 
     $html_body .= 'Only part of the file was uploaded'; 
     break; 
    case 4: 
     $html_body .= 'No file was uploaded'; 
     break; 
    default: 
     $html_body .= 'unknown errror'; 
    } 
    echo ($html_body); 
} 
+0

Sử dụng $ _SERVER [DOCUMENT_ROOT] cũng đã sửa nó cho tôi. – yaz

0

$path có phải là một tên tập tin và không phải là một đường dẫn đến một thư mục.