2010-08-17 10 views
23

Io sto usando il seguente codice e sto caricando con successo i file sul mio computer locale. Mostra "caricato con successo" sul mio computer locale.Errore PHP move_uploaded_file()?

Ma quando ho usato questo codice sul mio server online, non sta caricando il file e mostra solo il messaggio "Non caricato".

Come posso sapere qual è il problema e come posso visualizzare il problema effettivo all'utente?

+1

Avete la cartella delle immagini sul server web? La cartella è di sola lettura oppure puoi scrivere anche a? – gabe3886

+0

Qualche messaggio di errore generato da PHP? Non è necessario utilizzare $ spostati, è possibile inserire il comando move_uploaded_file nell'istruzione. – fabrik

+0

@all: questo è il problema che non mostra alcun errore/avviso sul server. Esiste una cartella Immagini e posso caricare file in questa cartella usando FileZilla. – Awan

risposta

33

Verificare che il server Web disponga delle autorizzazioni per scrivere nel "images /" directory

+0

Posso caricare manualmente i file in questa cartella usando FileZilla, significa che ha i diritti. Qualche altra possibilità? – Awan

+10

FileZilla non dimostra che il server Web disponga di autorizzazioni. Molto probabilmente il server Web verrà eseguito con un utente diverso da quello che sei. Per assicurarti che abbia le autorizzazioni, imposta le autorizzazioni su 777, quindi prova. Questo dovrebbe dimostrare se si tratta di un problema di autorizzazione o qualcos'altro. –

+0

chown -R 777 yourdirectory –

2

Ti controlli tale file viene caricato ok? Forse hai superato max_post_size o max_upload_filesize. Quando accedi con FileZilla stai copiando i file mentre tu, quando carichi da PHP, questo file proviene da un utente che esegue apache (per esempio www-data), prova a inserire chmod 755 per le immagini.

16

Come posso sapere che cosa è il problema

facile. Fare riferimento al log degli errori del server web.

Come è possibile visualizzare il problema effettivo da visualizzare all'utente?

MAI farlo.
Un utente medio non riuscirà a capire nulla di questo errore.
Un utente malintenzionato non dovrebbe ricevere feedback, soprattutto in una forma di messaggio di errore molto informativo.

Basta mostrare una pagina con scuse.

Se non si ha accesso al registro degli errori del server, l'attività diventa più complicata.
Ci sono diversi modi per mettersi in contatto con i messaggi di errore.

Per visualizzare i messaggi di errore sullo schermo è possibile aggiungere queste righe al codice

ini_set('display_errors',1); 
error_reporting(E_ALL); 

o per effettuare file di log di errore personalizzato

ini_set('log_errors',1); 
ini_set('error_log','/absolute/path/tp/log_file'); 

e ci sono altri modi.
ma è necessario comprendere che senza un messaggio di errore effettivo non è possibile spostarsi. E 'difficile essere ciechi al buio

+0

Bene, è corretto mostrare gli errori su un sito di sviluppo. Non è sempre possibile reindirizzare gli errori in un file di registro (ad esempio su hosting condiviso). –

+0

@Pekka stiamo parlando di live at atm. E, onestamente, un tale hosting dovrebbe essere abbandonato immediatamente. –

30

Prova questo:

$upload_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/"; 

if (is_dir($upload_dir) && is_writable($upload_dir)) { 
    // do upload logic here 
} else { 
    echo 'Upload directory is not writable, or does not exist.'; 
} 

questo sarà immediatamente contrassegnare eventuali errori di autorizzazione file.

+0

Non uno di loro. E tale gestione degli errori è inutile. –

+12

Cura di elaborare per quelli non informati? –

+1

Segnala "La directory di caricamento non è scrivibile o non esiste". Come è risolto, per favore spiega? –

1

o eseguire suexec e non è necessario modificare nuovamente le autorizzazioni.

5

move_uploaded_file() sarà di ritorno:

  1. FALSE se il nome del file non è valido
  2. FALSE e issue a warning nel log degli errori se il processo apache non dispone di autorizzazioni di lettura/scrittura per directory di origine o di destinazione

Registro errori PHP

mio log degli errori php era a: /var/log/httpd/error_log e aveva questi errori:

Attenzione: move_uploaded_file (immagini/robot.jpg): non riuscito ad aprire flusso: Autorizzazione negata in/var/www/html/mysite/mohealth. php on line 78

Attenzione: move_uploaded_file(): impossibile spostare '/ tmp/phpsKD2Qm' a 'immagini/robot.jpg' in /var/www/html/mysite/mohealth.php sulla linea 78

move_uploaded_file() tenta di spostare i file da una directory temporanea a una directory di destinazione. Quando il processo apache ha provato a spostare i file, non è stato possibile leggere il file temporaneo o scrivere nella directory di destinazione.

  1. Trova che l'utente è in esecuzione Apache (Web Server) controllare quale utente esegue il servizio apache da questo comando: ps aux | grep httpd. La prima colonna è il nome utente.

  2. controllo Lettura Autorizzazione al Temporary Dir: tuo grado di trovare il percorso della directory temporanea chiamando echo sys_get_tmp_dir(); in una pagina php. Poi sulla riga di comando, problema ls -ld /tmp/temporary-dir per vedere se l'utente apache ha accesso a leggere qui

  3. controllo Permesso di scrittura a destinazione Dir: problema ls -ld /var/www/html/destination-directory per vedere se l'utente apache ha accesso a scrivere qui

  4. aggiungere le autorizzazioni, se necessario utilizzando chown o chgrp

  5. Riavviare Apache utilizzando sudo service httpd restart

+0

Come controllare l'utente in Windows? – Black

+1

Il problema è stato risolto con la parola chiave "fonte". Guardate che: "move_uploaded_file() restituirà FALSE ed emetterà un avvertimento nel log degli errori se il processo di apache non ha permessi di lettura/scrittura su" sorgente "o directory di destinazione." Quindi non è sufficiente dare tutti i permessi alla directory del progetto e dovrebbe anche dare tutte le autorizzazioni alla posizione del file sorgente. – Hasan

22

Modificare il codice per essere come segue:

// Upload file 
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt"); 

if($moved) { 
    echo "Successfully uploaded";   
} else { 
    echo "Not uploaded because of error #".$_FILES["file"]["error"]; 
} 

Vi darà una delle seguente codice di errore valori da 1 a 8:

UPLOAD_ERR_INI_SIZE = Valore: 1; Il file caricato supera la direttiva upload_max_filesize in php.ini.

UPLOAD_ERR_FORM_SIZE = Valore: 2; Il file caricato supera la direttiva MAX_FILE_SIZE che è stata specificata nel modulo HTML.

UPLOAD_ERR_PARTIAL = Valore: 3; Il file caricato è stato caricato solo parzialmente.

UPLOAD_ERR_NO_FILE = Valore: 4; Nessun file è stato caricato.

UPLOAD_ERR_NO_TMP_DIR = Valore: 6; Manca una cartella temporanea. Introdotto in PHP 5.0.3.

UPLOAD_ERR_CANT_WRITE = Valore: 7; Impossibile scrivere il file su disco. Introdotto in PHP 5.1.0.

UPLOAD_ERR_EXTENSION = Valore: 8; Un'estensione PHP ha interrotto il caricamento del file. PHP non fornisce un modo per determinare quale estensione ha causato il blocco del caricamento del file; esaminare l'elenco delle estensioni caricate con phpinfo() può aiutare.

0

Si prega di verificare che il tag form hanno questo attributo:

enctype="multipart/form-data"

0
$uploadfile = $_SERVER['DOCUMENT_ROOT'].'/Thesis/images/'; 
$profic = uniqid(rand()).$_FILES["pic"]["name"]; 

if(is_uploaded_file($_FILES["pic"]["tmp_name"])) 
{ 
    $moved = move_uploaded_file($_FILES["pic"]["tmp_name"], $uploadfile.$profic); 
    if($moved) 
    { 
     echo "sucess"; 
    } 
    else 
    { 
     echo 'failed'; 
    } 
} 
0

Il virtual hosting controllare la disk quota.

in caso di superamento del limite, errore di ritorno move_uploaded_file.

PS: ho cercato questo a lungo :)