2009-11-30 11 views
15

Ho uno script di caricamento molto semplice, probabilmente sollevato direttamente dalla pagina di funzione php.net/move_upload_files.Caricamento file PHP, file che scompaiono da/tmp prima di move_uploaded_files

move_uploaded_file() non riuscito perché non riesce a trovare il file tmp nella cartella tmp. Ma SO che è stato messo lì, ma viene rimosso prima che lo move_upload_file() possa occuparsene nel mio script. So che è stato messo lì dal momento che posso vedere un file lì quando un file di grandi dimensioni viene pubblicato sul server.

Anche $_FILES contiene i dettagli corretti per il file che ho appena caricato.

Qualcuno aveva idea del motivo per cui il file temporaneo viene rimosso da/tmp prima che io abbia la possibilità di gestirlo?

Ecco il codice di base che sto utilizzando.

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file)) 
{ 
    $result['error'] = 'false'; 
    $result['file_loc'] = $upload_file; 
} 
else 
{ 
    $result['error'] = 'true'; 
} 

L'uscita del print_r($_FILES) assomiglia

[userfile] => Array 
(
    [name] => switchsolo.png 
    [type] => image/png 
    [tmp_name] => /tmp/phpIyKRl5 
    [error] => 0 
    [size] => 6690 
) 

Ma/tmp/phpIyKRl5 non è semplicemente lì.

+0

Si prega di inviare il modulo HTML. Penso che il problema sia nel tuo HTML. –

+0

Qual è il messaggio esatto di move_uploaded_file()? –

+0

Si prega di inviare il messaggio dal tuo registro degli errori –

risposta

-1

tuo form dovrebbe utilizzare un tag come questo:

<form method="post" enctype="multipart/form-data" action="..."> 

Usa multiple/form-data come enctype.

+2

$ _FILES non sarebbero vuoti se l'enctype fosse errata? –

+0

Non sono sicuro, non ho provato questo. Ma per esperienza, ogni volta che dimentico enctype = "mult ...", non ho file. Controllare questo è facile. Utilizza intestazioni HTTP Live o simili e verifica se il file è stato inviato. –

+0

Sicuramente ce l'ho dentro. – Bowen

0

Sei sicuro al 100% che il file sia effettivamente creato in/tmp? Se non hai i permessi di scrittura (o se l'utente esegue lo script) il file non verrà scritto in/tmp ma (immagino) lo vedrai durante il caricamento anche se non è effettivamente lì al termine del caricamento.

Modifica: $ _FILES ['file'] ['errore'] - Valore: 7; Impossibile scrivere il file su disco. Introdotto in PHP 5.1.0. Quindi controlla la tua versione di PHP. Se è inferiore a 5,1 scrivere su disco potrebbe essere il tuo problema.

+0

Sicuro al 100%, posso vedere che viene creato quando faccio un upload di file più grande, ma non appena è completo sembra scomparire. – Bowen

+0

Ah, leggi il resto del commento. Stiamo eseguendo 5.2, e, per il momento, la cartella tmp è 777 – Bowen

-2

Si utilizza il valore di ritorno della move_uploaded_file() alla rovescia:

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file)) 
{ 
    $result['error'] = 'true'; 
} 
else 
{ 
    $result['error'] = 'false'; 
    $result['file_loc'] = $upload_file; 
} 
+1

Sicuramente la funzione restituisce VERO se è stata eseguita correttamente ?! – Bowen

0

Ho avuto questo problema io stesso. Nel mio caso php stava caricando nella cartella tmp sbagliata. Invece di usare la cartella tmp dei domini (in un host virtuale su plesk) stava caricando direttamente nella cartella temporanea del sistema operativo.

Controllare le impostazioni delle cartelle temporanee

6

Il file viene rimosso dopo che lo script termina l'esecuzione. Se si esegue lo script e quindi si controlla la cartella/tmp /, il file non sarà lì, a prescindere da cosa.

10

1) Il post_max_size e upload_max_filesize contengono un valore superiore alla dimensione del file che si sta tentando di caricare?

2) Lo script di caricamento richiede più tempo per l'esecuzione rispetto al valore della variabile max_execution_time?

3) Presumo che lo script di caricamento non consumi la quantità di memoria consentita dalla variabile memory_limit. Quando il client sta caricando il file sul server, probabilmente il server ne sta trattenendo un po 'in memoria mentre lo fa. Non sono sicuro che in qualche modo influenzi il limite della variabile memory_limit in php.ini.

Queste variabili possono essere modificate in php.ini e/o .htaccess o con ini_set().

Spero che questo aiuti.

+2

Ogni volta che ho avuto un problema con il caricamento di file, è stato risolto prestando attenzione a 1 o 2. +1 – bradym

0

Per riferimento futuro questo può anche accadere quando Apache non ha accesso alla directory di destinazione (ricordarsi di cambiare l'ACL !!).

0

Ho avuto lo stesso problema, dove 'tmp_name' direi che è memorizzato in '/ private/var/tmp /' ma il file non esisterebbe lì.

ho dovuto aggiungere "E" al mio "ordine variabili" in php.ini ; variables_order Valore predefinito: "EGPCS"

Spero che questo aiuti.

1

Stavo provando http://www.w3schools.com/php/php_file_upload.asp E mi sono imbattuto nello stesso bug.

Nel mio caso, aggiungendo un "./" prima che la destinazione $ risolva il problema.

bool move_uploaded_file (string $filename , string $destination) 
1

Stavo avendo questo problema pure, sono imbattuto in questo sito web per una soluzione - non farlo tho;)

stavo ottenendo le informazioni corrette durante la visualizzazione di print_r($_FILES) ma non era in grado di eseguire move_uploaded_file ...

Ho risolto il problema controllando l'attributo del percorso $upload_file nella funzione move_uploaded_file - assicurarsi che sia corretto altrimenti non funzionerà (il mio era errato).

Inoltre, il file nella posizione temp viene rimosso automaticamente, penso che sia il modo in cui funziona PHP.

Spero che questo abbia aiutato.

+0

+1 per aver menzionato che il file temporaneo viene rimosso dopo che lo script termina. Non avevo ancora fatto alcun move_upload_file ... funzionava da sempre. – djnz0feh

1

Può anche darsi che la cartella di destinazione non esista o che non si disponga dell'autorizzazione alla scrittura.

0

prova semplice da fare a destra prima la funzione move_uploaded_file():

if (!file_exists("upload")) { 
    if (mkdir("upload")) { 
    echo "Upload directory created!"; 
    } 
    else { 
    die("Invalid upload directory!"); 
    } 
} 
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 
0

stare attenti con il vostro $ upload_file. potrebbe essere stata la mancanza di un "/" quando il percorso della cartella è stato concatenato e il nome del file caricato.

Problemi correlati