2010-05-29 25 views
8

Używam PHP do przesyłania plików. W dokumencie PHP manual pokazano przykład wykorzystujący ukryte pole MAX_FILE_SIZE, informując, że wykryje on po stronie klienta (tj. Przeglądarki), czy plik jest zbyt duży, czy nie.Wykrywanie rozmiaru wysyłanego pliku po stronie klienta?

Właśnie próbowałem tego przykładu w Firefoksie, Chrome i IE i to nie działa. Plik jest zawsze przesyłany, nawet jeśli jest znacznie większy niż określone ukryte pole.

Nawiasem mówiąc, jeśli plik jest większy niż MAX_FILE_SIZE, to wywołanie move_uploaded_file nie działa, więc wydaje się, że zmienna ma wpływ po stronie serwera, ale nie po stronie klienta.

Odpowiedz

10

Na MAX_FILE_SIZE

Przeczytaj to:

... Na http://pk.php.net/manual/en/features.file-upload.post-method.php i równoważne lokalizacje w innych formatach, stwierdza się, że przeglądarek uwzględni wartość pola formularza MAX_FILE_SIZE do rachunku.

Informacje powtarza się w innych miejscach w internecie i w książkach, ale wydaje się pochodzić z dokumentacji PHP (to nie pojawia się w względem innych technologii server-side).

Nie ma nic w żadnej z HTML, HTTP lub pokrewnych specyfikacji wskazać że jest to przypadek (w szczególności RFC 1867, która wprowadziła plik przesłane do HTML nie wspominając już, więc to nie jest nawet przypadek kludge , który został wymieniony w pierwszym RFC, a następnie został usunięty), ani nie ma znaczenia w kontekście specyfikacji HTML (nie ma nic, co by wskazywało na związek między tym konkretnym ukrytym wejściem a wejściowym plikiem) . Jedyne oświadczenia na temat ukrytych pól, które mogłem znaleźć w którymkolwiek z nich, to ostrzeżenia w sekcjach dotyczących czynników ochrony przed użytkownikami-agentami w oparciu o operacje związane z plikami na czymkolwiek wspomnianym w ukrytym polu .

Brak przeglądarek, które wykonują to jako "rozszerzenie". Rzeczywiście, biorąc pod uwagę, że ma potencjalnie inne możliwe znaczenie dla ukrytego pola o nazwie , która ma nazwę w aplikacji obsługującej kilka plików do przesłania, będzie ona uznawana za wadę konstrukcyjną jakiejkolwiek innej.

Uważam, że nie ma takiego mechanizmu w przeglądarkach głównego nurtu (jeśli w ogóle jest on dostępny) i tak naprawdę nie powinien być. Odniesienie do niego powinno zostać usunięte z dokumentacji .

Sugeruję, że skoro ten pomysł rozpowszechnił się z tej dokumentacji gdzie indziej, notatka o tym, że nie działa, powinna być dodana jako .

Jeśli mechanizm jest wymagane lub pożądane dla szybszego operowania tym rodzaju plików przenoszenia problem to wymaga funkcjonalności, aby umożliwić PHP przechwytywać strumienie są przesyłane przed zakończeniem żądania, które byłaby zupełnie inna jak ta dokumentacja sugerować to powinno być rozpatrywane, nawet gdyby to była prawda ...


kod poniżej pochodzą z wdrożenia php SWFUpload:

// Check post_max_size (http://us3.php.net/manual/en/features.file-upload.php#73762) 
    $POST_MAX_SIZE = ini_get('post_max_size'); 
    $unit = strtoupper(substr($POST_MAX_SIZE, -1)); 
    $multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1))); 

    if ((int)$_SERVER['CONTENT_LENGTH'] > $multiplier*(int)$POST_MAX_SIZE && $POST_MAX_SIZE) { 
     header("HTTP/1.1 500 Internal Server Error"); 
     echo "POST exceeded maximum allowed size."; 
     exit(0); 
    } 
// Validate the file size (Warning the largest files supported by this code is 2GB) 
    $max_file_size_in_bytes = 2147483647;   
    $file_size = @filesize($_FILES[$upload_name]["tmp_name"]); 
     if (!$file_size || $file_size > $max_file_size_in_bytes) { 
      HandleError("File exceeds the maximum allowed size"); 
      exit(0); 
     } 
+0

+1; dobre dochodzenie. – strager

+0

'musisz sprawdzić, czy przesłany plik był mniejszy niż MAX_FILE_SIZE używając PHP' no, nie robisz tego. Po prostu pozbyć się tego bezużytecznego pola –

+0

"wymaga funkcjonalności, aby umożliwić PHP przechwytywanie strumieni przesyłanych przed zakończeniem żądania" -> PHP może przechwycić żądanie, jeśli jego długość przekracza limit określony w 'post_max_size', ale wymaga przesłania do nagłówka żądania przeglądarki zawierającego 'Content-Length' i tylko ze współczesnych przeglądarek Opera wydaje ten nagłówek. –

3

O ile wiem, nie ma prostego, rozwiązanie cross-browser, aby to osiągnąć. Jedynymi działającymi rozwiązaniami są Flash lub Java, ponieważ te technologie mogą uzyskać dostęp do systemu plików i uzyskać informacje o pliku.

Przykładowe skrypty: YUI2 Uploader, FancyUpload, SWFUpload

+0

Istnieje również Uploadify (http://www.uploadify.com/) do przesyłania plików HTML5 –

6

To działa chyba tylko na Firefox 3.6 teraz:

<script type="text/javascript"> 
    function checkSize() 
    { 
     var input = document.getElementById("upload"); 

     // check for browser support (may need to be modified) 
     if(input.files && input.files.length == 1) 
     {   
      if (input.files[0].fileSize > 1024) /* or maybe .size */ 
      { 
       alert("The file must be less than 1KB"); 
       return false; 
      } 
     } 

     return true; 
    } 
</script> 


<form method="post" enctype="multipart/form-data" onsubmit="return checkSize()">  
    <input type="file" id="upload" /> 
    <input type="submit" /> 
</form> 

Zobacz http://www.w3.org/TR/FileAPI/.

1

Jeśli używasz prawidłowo ukrytego pola MAX_FILE_SIZE, przesyłanie plików zatrzyma się, gdy rozmiar przesłanego pliku osiągnie określoną wartość. W ten sposób oszczędza użytkownikom kłopotów z oczekiwaniem na przesłanie dużego pliku. Należy sprawdzić, czy przesyłanie plików zostało zatrzymane, po stronie serwera, generując wygenerowany error code.

if($_FILES['userfile']['error'] == 2) 
{ 
die("Maximum file size Exceeded"); 
} 
Powiązane problemy