2012-02-05 46 views
19

Tôi có biểu mẫu tải lên và đang kiểm tra kích thước tệp và loại tệp để giới hạn tệp được tải lên 2 megabyte và các tệp .pdf, .jpg, .gif hoặc .png. Mục tiêu của tôi là có một thông điệp cảnh báo được hiển thị cho người dùng nếu họ vi phạm một trong các quy tắc này.Làm cách nào để hạn chế kích thước tệp loại tệp tải lên bằng PHP?

Có bốn trường hợp:

  1. Chỉnh sửa kích cỡ/Đúng Kiểu (làm việc)
  2. Chỉnh sửa kích cỡ/KHÔNG ĐÚNG Loại (làm việc)
  3. Kích KHÔNG ĐÚNG/Đúng Kiểu (không làm việc)
  4. Kích thước INCORRECT/INCORRECT Loại (không hoạt động)

Với mã hiện tại của tôi, mã luôn hiển thị thông báo "loại" không chính xác khi kích thước tệp lớn hơn 2 megabyte (# 4), ngay cả khi loại tệp là chính xác (# 3).

Mọi ý tưởng tại sao?

if (isset ($_FILES['uploaded_file'])) { 

    $file_size = $_FILES['uploaded_file']['size']; 
    $file_type = $_FILES['uploaded_file']['type']; 

    if (($file_size > 2097152)){  
     $message = 'File too large. File must be less than 2 megabytes.'; 
     echo '<script type="text/javascript">alert("'.$message.'");</script>'; 
    } 
    elseif ( 
     ($file_type != "application/pdf") && 
     ($file_type != "image/jpeg") && 
     ($file_type != "image/jpg") && 
     ($file_type != "image/gif") && 
     ($file_type != "image/png")  
    ){ 
     $message = 'Invalid file type. Only PDF, JPG, GIF and PNG types are accepted.'; 
     echo '<script type="text/javascript">alert("'.$message.'");</script>';   
    }  
    else { 
     store_uploaded_file($id); 
    } 

} 
+0

xin lỗi, đó không phải là đại diện chính xác. cảnh báo không được gọi nếu tệp của họ thực sự được tải lên. câu hỏi được cập nhật. – Michael

+0

Bạn có 'die()' ing hoặc 'exit()' ing sau 'header()' hay mã của bạn kết thúc sau câu lệnh if? –

+0

xin lỗi, tôi đang cố tóm tắt. nó gọi hàm store_uploaded_file(), thực hiện các hành động khác trên trang. mã không kết thúc sau khi tải lên thành công. – Michael

Trả lời

28

Nội dung mà mã của bạn không tính đến đang hiển thị nhiều lỗi. Như bạn đã lưu ý ở trên, người dùng có thể tải lên tệp> 2MB thuộc loại sai, nhưng mã của bạn chỉ có thể báo cáo một trong các vấn đề. Hãy thử một cái gì đó như:

if(isset($_FILES['uploaded_file'])) { 
    $errors  = array(); 
    $maxsize = 2097152; 
    $acceptable = array(
     'application/pdf', 
     'image/jpeg', 
     'image/jpg', 
     'image/gif', 
     'image/png' 
    ); 

    if(($_FILES['uploaded_file']['size'] >= $maxsize) || ($_FILES["uploaded_file"]["size"] == 0)) { 
     $errors[] = 'File too large. File must be less than 2 megabytes.'; 
    } 

    if(!in_array($_FILES['uploaded_file']['type'], $acceptable)) && (!empty($_FILES["uploaded_file"]["type"]))) { 
     $errors[] = 'Invalid file type. Only PDF, JPG, GIF and PNG types are accepted.'; 
    } 

    if(count($errors) === 0) { 
     move_uploaded_file($_FILES['uploaded_file']['tmpname'], '/store/to/location.file'); 
    } else { 
     foreach($errors as $error) { 
      echo '<script>alert("'.$error.'");</script>'; 
     } 

     die(); //Ensure no more processing is done 
    } 
} 

Nhìn vào các tài liệu cho move_uploaded_file() (nó được gọi là di chuyển không lưu trữ) để biết thêm.

+1

Mã của bạn sạch hơn nhiều; tuy nhiên, tôi phát hiện ra rằng vấn đề của tôi là thực sự với giới hạn được đặt trong php5.ini.Tôi đang sử dụng GoDaddy, mặc định giới hạn là 2MB. Đối với tất cả các tệp được tải lên lớn hơn giá trị này, giá trị trả về của $ _FILES ['uploaded_file'] ['size'] trở lại là "0" và giá trị trả về của $ _FILES ['uploaded_file'] ['type'] là trống. Tôi đã phải sửa đổi mã của bạn một chút. – Michael

+0

hi, tôi nghĩ rằng nếu (đếm ($ lỗi)! == 0) nên được nếu (đếm ($ lỗi) == 0), mặc dù nó không phải là một sai lầm hợp lý, loại lỗi typo, nhưng tôi nghĩ rằng nó nên được sửa chữa để tránh bất kỳ sự nhầm lẫn nào. – Dharmang

+0

@Dharmang Bạn chính xác! Tôi đã chỉnh sửa lỗi đánh máy. Cảm ơn. ;) –

0

Nếu bạn đang tìm kiếm một giới hạn cứng trên tất cả các cập nhật trên trang web, bạn có thể giới hạn này trong php.ini bằng cách thiết lập như sau:

'upload_max_filesize = 2M` ' post_max_size = 2M`

rằng sẽ thiết lập các giới hạn tải lên tối đa đến 2 MB

+0

Mặc dù điều này không phải là rất di động trên một số máy chủ (mà không cho phép sửa đổi PHP.ini) hoặc nếu bạn muốn áp đặt giới hạn kích thước tệp khác nhau trên một tệp php khác. –

4

Hope this helps :-)

if(isset($_POST['submit'])){ 
    ini_set("post_max_size", "30M"); 
    ini_set("upload_max_filesize", "30M"); 
    ini_set("memory_limit", "20000M"); 
    $fileName='product_demo.png'; 

    if($_FILES['imgproduct']['size'] > 0 && 
      (($_FILES["imgproduct"]["type"] == "image/gif") || 
       ($_FILES["imgproduct"]["type"] == "image/jpeg")|| 
       ($_FILES["imgproduct"]["type"] == "image/pjpeg") || 
       ($_FILES["imgproduct"]["type"] == "image/png") && 
       ($_FILES["imgproduct"]["size"] < 2097152))){ 

     if ($_FILES["imgproduct"]["error"] > 0){ 
      echo "Return Code: " . $_FILES["imgproduct"]["error"] . "<br />"; 
     } else {  
      $rnd=rand(100,999); 
      $rnd=$rnd."_"; 
      $fileName = $rnd.trim($_FILES['imgproduct']['name']); 
      $tmpName = $_FILES['imgproduct']['tmp_name']; 
      $fileSize = $_FILES['imgproduct']['size']; 
      $fileType = $_FILES['imgproduct']['type']; 
      $target = "upload/"; 
      echo $target = $target .$rnd. basename($_FILES['imgproduct']['name']) ; 
      move_uploaded_file($_FILES['imgproduct']['tmp_name'], $target); 
     } 
    } else { 
     echo "Sorry, there was a problem uploading your file."; 
    } 
} 
0
var sizef = document.getElementById('input-file-id').files[0].size; 
       if(sizef > 210000){ 
        alert('sorry error'); 
       }else { 
        //action 
       } 
0

Hope hữu ích này ...

dạng:

<form action="check.php" method="post" enctype="multipart/form-data"> 
<label>Upload An Image</label> 
<input type="file" name="file_upload" /> 
<input type="submit" name="upload"/> 
</form> 

check.php:

<?php 
    if(isset($_POST['upload'])){ 
     $maxsize=2097152; 
     $format=array('image/jpeg'); 
    if($_FILES['file_upload']['size']>=$maxsize){ 
     $error_1='File Size too large'; 
     echo '<script>alert("'.$error_1.'")</script>'; 
    } 
    elseif($_FILES['file_upload']['size']==0){ 
     $error_2='Invalid File'; 
     echo '<script>alert("'.$error_2.'")</script>'; 
    } 
    elseif(!in_array($_FILES['file_upload']['type'],$format)){ 
     $error_3='Format Not Supported.Only .jpeg files are accepted'; 
     echo '<script>alert("'.$error_3.'")</script>'; 
     } 

     else{ 
      $target_dir = "uploads/"; 
      $target_file = $target_dir . basename($_FILES["file_upload"]["name"]); 
      if(move_uploaded_file($_FILES["file_upload"]["tmp_name"], $target_file)){ 
      echo "The file ". basename($_FILES["file_upload"]["name"]). " has been uploaded."; 
      } 
      else{ 
       echo "sorry"; 
       } 
      } 
    } 
?> 
Các vấn đề liên quan