2009-07-02 12 views
17

Sto provando a mettere insieme un modulo HTML POST -ed con due campi: un caricamento di file e un campo di testo. Poiché il modulo ha un tipo multipart/form-data per il caricamento del file, non riesco ad accedere al campo di testo tramite la normale variabile PHP $ _POST. Quindi, come posso ottenere il campo di testo nel modulo con PHP?PHP - analisi dei dati modulo multiparte

Come da richiesta, ecco qualche codice, sostanzialmente preso direttamente da 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>"; 
?> 

Questo è l'intero file di prova. Se rimuovo l'enctype, posso ottenere i dati POST-ed, ma non il file, ovviamente. Con l'enctype come multipart/form-data, posso ottenere il file, ma niente dai dati POST-ed.

Ecco l'output con l'enctype:

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

Senza:

testing 

NULL 

stesso ingresso entrambe le volte esatto.

+1

Come Jonathan e Andrew hanno detto, $ _POST dovrebbe funzionare, assumendo che tu abbia usato post per pubblicare il tuo modulo (e questo è un buon presupposto, perché devi pubblicare i file). Quindi puoi pubblicare del codice? Assicurati che l'attributo name sia impostato nel campo di testo html, e questo è quello che usi per ottenere il valore di testo del testo. – alanquillin

risposta

22

I caricamenti di file arrivano tramite $_FILES. Tutto il resto passa attraverso $_POST (presupponendo ovviamente che il modulo HTML abbia l'attributo method impostato su "post").

+0

Vuoi dire che il modulo * metodo * era Post? – Pacerier

+0

@Pacerier Oops, grazie per la correzione. – Sampson

+0

Il client invia ciascuna parte una per una? Come faccio a impostarlo per inviare un file e alcuni dati contemporaneamente? – Richard

4

$_POST dovrebbe funzionare correttamente per il campo di testo. Sarà necessario utilizzare $_FILES per il file effettivo. Dato il seguente codice 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> 

È possibile accedere ai campi nel seguente modo:

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

Non funziona. Solo per provare, ho persino copiato/incollato ciò che hai inserito (ma ho aggiunto un pulsante di invio) e l'ho provato - sicuramente non funziona. Se rimuovo l'enctype, funziona, ma non ottengo il file ovviamente, e se lo lascio come multipart/form-data, ottengo il file, ma io * non * ottengo i dati POST-ed . – DashRantic

+0

dovrebbe funzionare. il tuo problema è altrove. – Javier

+1

Quale versione di PHP stai usando? Eventuali modifiche alla configurazione e estensioni speciali abilitate? –

1

c'è niente di sbagliato con il codice; potrebbe essere un problema con la configurazione del server.

<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); ?> 

Script: http://sandbox.phpieceofcake.com/upload/1246558881125336.php
Fonte: http://sandbox.phpieceofcake.com/upload/1246558881125336.phps

+0

Collegamenti in basso ..... – Pacerier

+0

Provare a eseguire il codice su un server di prova. L'output var_dump mostrerebbe che sia $ _POST che $ _FILES sono riempiti con l'input del modulo e le informazioni sul caricamento del file e che non si escludono a vicenda. – Shanshui

0

[2010-02-13 10:57 GMT] sudeshkmr a yahoo dot com

Ho affrontato lo stesso problema e niente ha funzionato. Ho testato su Apache 2.2, PHP 5.3 su Windows Vista. Ho anche testato su Ubuntu (Karmic) con Apache 2.2 e PHP 5.3. Ho anche provato con nGinX 0.8 e PHP 5.3.

Quindi ho trovato una soluzione alternativa. Il parametro action = "" non deve essere la pagina di script in cui è presente il modulo di caricamento del file. Ad esempio, hai una pagina index.php con il modulo di caricamento.

L'azione = "upload.php" < -------- Questa pagina deve essere diverso da quello della pagina del modulo di caricamento di file, e funziona su tutte le configurazioni di PHP!

Non utilizzare per il parametro di azione.

8

Controlla il tuo limite di post. Stavo impazzendo cercando di capire cosa stava causando questo. Un rapido controllo del log degli errori di Apache ha mostrato che la lunghezza del contenuto del post ha superato il limite. Dopo aver aumentato il limite, i dati del post sono disponibili.

+1

La risposta più aggiornata risolve il problema, ma questo può in particolare morderti se stai caricando file di grandi dimensioni. Se non sbaglio, la lunghezza è la somma di tutti i file (vedi http://stackoverflow.com/questions/10453735/trying-to-upload-video-file-in-php-but-its-too-large). Se sei un po 'così, il $ _FILES [' whatever '] si comporterà come una variabile non valida. –

1

Ho avuto lo stesso problema, come indicato all'inizio. Provalo caricando una dimensione del file inferiore a 1 MB, se sei stato in grado di caricare il file, il problema è che i valori upload_max_filesize e post_max_size aumentano tali valori e riprovano. Questa era la soluzione al mio problema.

+0

Probabilmente questa è la risposta giusta. – MarkSkayff