2009-07-02 23 views
17

Próbuję utworzyć formularz HTML POST-ed, który ma dwa pola - plik do przesłania i pole tekstowe. Ponieważ formularz ma typ wieloczęściowy/dane formularza do przesłania pliku, nie można uzyskać w polu tekstowym za pomocą zwykłej zmiennej PHP _ _POST. Więc jak mogę uzyskać w polu tekstowym w formularzu z PHP?PHP - przetwarzanie wieloczęściowych danych formularza

Jak na żądanie, tu jest jakiś kod, w zasadzie pobierane bezpośrednio z Andrew:

<html> 
    <body> 
     <form action="test2.php" method="post" enctype="multipart/form-data"> 
      Name: <input type="text" name="imageName" /> 
      Image: <input type="file" name="image" /> 
      <input type="submit" value="submit" /> 
     </form> 
    </body> 
</html> 

<?php 
    echo $_POST['imageName']; 
    echo "<pre>"; 
    echo var_dump($_FILES['image']); 
    echo "</pre>"; 
?> 

To cały plik testowy. Jeśli usuniemy enctype, mogę uzyskać dane POST-ed, ale nie plik oczywiście. Dzięki entype jako wieloczęściowym/formularzowym, mogę uzyskać plik, ale nic z danych POST.

Oto wyjście z enctype:

array(5) { 
    ["name"]=> 
    string(34) "testing.png" 
    ["type"]=> 
    string(0) "" 
    ["tmp_name"]=> 
    string(0) "" 
    ["error"]=> 
    int(1) 
    ["size"]=> 
    int(0) 
} 

Bez:

testing 

NULL 

dokładnie taki sam wkład zarówno razy.

+1

Jak Jonathan i Andrew powiedzieli, $ _POST powinien działać, zakładając, że użyłeś posta do opublikowania formularza (i to jest dobre założenie, ponieważ musisz wysyłać pliki). Czy możesz napisać jakiś kod? Upewnij się, że atrybut nazwy jest ustawiony w polu tekstowym HTML i to jest to, czego używasz, aby uzyskać wartość tekstową. – alanquillin

Odpowiedz

22

Przesyłanie plików odbywa się przez $_FILES. Wszystko inne przechodzi przez $_POST (zakładając oczywiście, że Twój formularz HTML miał ustawiony atrybut method na "post").

+0

Masz na myśli założenie, że forma * metoda * to Post? – Pacerier

+0

@Pacerier Ups, dzięki za poprawkę. – Sampson

+0

Czy klient wysyła każdą część jeden po drugim? Jak ustawić, aby wysłać plik i niektóre dane jednocześnie? – Richard

4

$_POST powinien działać dobrze dla pola tekstowego. Będziesz musiał użyć $_FILES dla rzeczywistego pliku. Biorąc pod uwagę następujące HTML:

<html> 
    <body> 
    <form action="self.php" method="post" enctype="multipart/form-data"> 
     Name: <input type="text" name="imageName" /> 
     Image: <input type="file" name="image" /> 
     <input type="submit" value="Submit" /> 
    </form> 
    </body> 
</html> 

można uzyskać dostęp do pola w następujący sposób:

<?php 
    echo $_POST['imageName']; 
    echo "<pre>"; 
    echo var_dump($_FILES['image']); 
    echo "</pre>"; 
?> 
+1

Nie działa. Aby spróbować, nawet skopiowałem/wkleiłem to, co tam umieściłeś (ale dodano przycisk przesyłania) i próbowałem tego - zdecydowanie nie działa. Jeśli usuniemy enctype, to działa, ale nie dostaję go oczywiście, a jeśli zostawiam go jako wieloczęściowy/formularzowy-dane, otrzymam plik, ale ja nie * otrzymam POST-ed danych . – DashRantic

+0

powinno działać. twój problem jest gdzieś indziej. – Javier

+1

Jakiej wersji PHP używasz? Jakieś zmiany konfiguracji i specjalne rozszerzenia włączone? –

1

Nie ma nic złego w kodzie; może być problem z konfiguracją serwera.

<form action="" method="post" enctype="multipart/form-data"> 
Name: <input type="text" name="imageName"> 
Image: <input type="file" name="image"> 
<input type="submit" value="submit"> 
</form> 

<?php var_dump($_POST, $_FILES); ?> 

Scenariusz: http://sandbox.phpieceofcake.com/upload/1246558881125336.php
Źródło: http://sandbox.phpieceofcake.com/upload/1246558881125336.phps

+0

Łącza w dół ..... – Pacerier

+0

Spróbuj uruchomić kod na serwerze testowym. Dane wyjściowe var_dump pokaże, że zarówno $ _POST, jak i $ _FILES są wypełnione danymi wejściowymi formularza oraz informacjami o przesłaniu pliku i że nie wykluczają się wzajemnie. – Shanshui

0

[2010-02-13 10:57 UTC] sudeshkmr na yahoo dot com

I w obliczu tego samego problemu i nic nie działało. Testowałem na Apache 2.2, PHP 5.3 na Windows Vista. Testowałem również na Ubuntu (Karmic) z Apache 2.2 i PHP 5.3. Testowałem także z nGinX 0.8 i PHP 5.3.

Potem znalazłem obejście. Parametr action = "" nie powinien być samą stroną skryptu, na której znajduje się formularz przesyłania plików. Na przykład masz stronę index.php z formularzem do przesyłania.

Akcja = „upload.php” < -------- Ta strona musi być inna niż strona formularza przesyłania plików, a to działa na wszystkich konfiguracji PHP!

Nie należy używać dla parametru działania.

8

Sprawdź swój limit postów. Szaleję, próbując dowiedzieć się, co to powoduje. Szybkie sprawdzenie rejestru błędów Apache wykazało, że długość treści postu przekroczyła limit. Po podniesieniu limitu dane o wpisie są dostępne.

+1

Najbardziej uprzywilejowana odpowiedź rozwiązuje problem, ale może to cię szczególnie ugryźć, jeśli przesyłasz duże pliki. Jeśli się nie mylę, długość jest sumą wszystkich plików (zobacz http://stackoverflow.com/questions/10453735/trying-to-upload-video-file-in-php-but-its-too- large). Jeśli jesteś przez to nieco, $ _FILES ["cokolwiek"] będzie działało jak niepoprawna zmienna. –

1

miałem ten sam problem, jak pokazano na początku. Spróbuj, ładując plik o rozmiarze mniejszym niż 1 MB. Jeśli udało Ci się przesłać plik, wówczas problem to upload_max_filesize, a wartość post_max_size zwiększają te wartości i spróbuj ponownie. To było rozwiązanie mojego problemu.

+0

Prawdopodobnie jest to właściwa odpowiedź. – MarkSkayff

Powiązane problemy