2013-01-23 16 views
29

stavo facendo uno script di caricamento quando ho testato un file di immagine con questa estensione .JPG, non so qual è la differenza tra jpg o jpeg, ma sembra che $ _FILES non riconosca questo tipo di file.

Ho letto diverse discussioni che $ _FILES ins't che affidabile quando si tratta di tipo MIME, così ho deciso di utilizzare la funzione del PHP tipo MIME mime_content_type(), php di getimagesize(), pathinfo(), anche se pathinfo restituisce un nome di file, e digita, ma ho bisogno del percorso del file che NON è presente, tutte le funzioni vengono passate con $ _FILES ['file'] ['tmp_name'] come parametri.

Quindi questo problema si presentava quando ho deciso di caricare un file immagine, ad esempio sample.JPG, penso che la maggior parte di questi file siano grezzi dalla fotocamera < - questo è quello che penso però, ma ciò che è più importante è che io può caricarli .JPG, .jpg, jpeg, .png. tutti funzionano bene tranne per .JPG.

Il problema principale è che il campo ['tmp_name'] in $ _FILES non ha valori quando deve essere caricato .JPG.

Ognuno di voi che ha riscontrato questo problema, si prega di condividere il vostro workaround o "come hai fatto" tipo di cosa.

+0

Assicurati di impostare il tuo enctype di form su 'enctype =" multipart/form-data "'. Ho la sensazione che tu non lo imposti. – vinu

+0

nahh l'ho già impostato, se non avessi caricato altri tipi di file, solo .JPG non verrà caricato – lemoncodes

risposta

44

Se $_FILES[$field]['tmp_name'] è vuoto, il file non è stato caricato. Si dovrebbe guardare $_FILES[$field]['error'] per capire perché.

FWIW, e per quanto ho capito, il tipo mime in $_FILES[] viene fornito dal browser.

Aggiornamento: ecco un po 'di codice in vaso per gestire tutti gli errori di caricamento file:

 $message = 'Error uploading file'; 
     switch($_FILES['newfile']['error']) { 
      case UPLOAD_ERR_OK: 
       $message = false;; 
       break; 
      case UPLOAD_ERR_INI_SIZE: 
      case UPLOAD_ERR_FORM_SIZE: 
       $message .= ' - file too large (limit of '.get_max_upload().' bytes).'; 
       break; 
      case UPLOAD_ERR_PARTIAL: 
       $message .= ' - file upload was not completed.'; 
       break; 
      case UPLOAD_ERR_NO_FILE: 
       $message .= ' - zero-length file uploaded.'; 
       break; 
      default: 
       $message .= ' - internal error #'.$_FILES['newfile']['error']; 
       break; 
     } 
     if(!$message) { 
      if(!is_uploaded_file($_FILES['newfile']['tmp_name'])) { 
       $message = 'Error uploading file - unknown error.'; 
      } else { 
       // Let's see if we can move the file... 
       $dest .= '/'.$this_file; 
       if(!move_uploaded_file($_FILES['newfile']['tmp_name'], $dest)) { // No error supporession so we can see the underlying error. 
        $message = 'Error uploading file - could not save upload (this will probably be a permissions problem in '.$dest.')'; 
       } else { 
        $message = 'File uploaded okay.'; 
       } 
      } 
     } 
+0

sì, alcune persone dicono che non è affidabile dato che è fornito dal browser e alcuni non supportano nemmeno alcuni file ext ... tutto quello che vedo per errore è 1 e 0 non c'è davvero un'esploazione – lemoncodes

+11

1 è 'UPLOAD_ERR_INI_SIZE' che significa che il file è troppo grande. :-) Guarda qui: http://php.net/manual/en/features.file-upload.post-method.php – staticsan

+0

hmm non sapeva che ci sono altri valori oltre a 1 e 0 che l'errore ritorna .. im a proposito, c'è una certezza che, se non c'è valore sul campo ['tmp_name'] e la dimensione è zero (0), c'è qualcosa che non va nel file ext ?. Voglio dire che non è stato caricato comunque. e pensavo che usare $ _FILES non fosse del tutto raccomandato? – lemoncodes

0

Basta provare questo e vedere cosa succede,

if (($_FILES['file']['type']) == "image/jpg" || ($_FILES['file']['type']) == "image/jpeg") { 
         //do uploading stuff here 
        }else{ 
        echo 'File is not a valid JPG,JPEG'; 
        } 
+0

Il tipo di campo nope non ha valore anche quando si tratta di. Estensioni file JPG – lemoncodes

+0

Okay per quanto riguarda la tua domanda, hai detto che i file di caricamento provengono dalla fotocamera. Hai provato un file .JPG diverso con il tuo codice? Voglio dire trovare un'immagine da Google che sta avendo .JPG e provalo dal tuo codice. Anche l'immagine che hai caricato è .JPG ci sono alcune immagini con diversi livelli di formati. Potresti essere arrabbiato con me per aver detto questo tipo di cose. Ma è meglio provare :) – vinu

+0

yep testato 1 immagine avente lo stesso ext. sempre lo stesso – lemoncodes

0

sembra come se si tratta di un caso problema perché mentre stavo creando uno script per caricare file CSV, alcuni file CSV non avrebbero problemi a caricare, ma in altri casi, $_FILES['file'][tmp_name] sarebbe vuoto.

19

Controlla la tua php.ini e, in particolare, questa impostazione

; Maximum allowed size for uploaded files. 
; http://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize 
upload_max_filesize = 6M 

O fare questo nella vostra configurazione di Apache:

<Directory "/var/www/vhosts/path/to/your/directory/import/"> 
    php_value post_max_size 6M 
    php_value upload_max_filesize 6M 
</Directory> 

Vorrei anche dire che è povero che PHP non segnala un errore nei log degli errori se si carica un file più grande dell'impostazione php.ini upload_max_filesize. Ad esempio, se carichi un file da 6MB quando lo hai impostato su 2M (che credo sia l'impostazione predefinita).

+0

Eccellente, grazie. Comando rapido per trovare il percorso del file php.ini dal terminale su mac "php -i | grep .ini" –

+0

Grazie mille. Il tuo commento risparmiando un sacco di tempo. – TommyDo

2

Avevo lo stesso problema e avere familiarità con la maggior parte della piattaforma .NET ti fa dimenticare cose che accadono nel lato client html.

Il mio problema era che il mio modulo aveva un input nascosto MAX_FILE_SIZE che ha un valore inferiore rispetto ai byte equivalenti del file.

Il modulo dovrebbe avere questo;

Oltre a questo, il vostro tag form deve includere enctype = "multipart/form-data"

ero thining che la dimensione massima del file era in kb, ma è in byte, grazie ad alcune altre pagine in StackOverflow.

L'altro motivo che potrebbe causare questo problema le impostazioni php.ini che le persone hanno menzionato nei commenti precedenti. Si dovrebbe anche post_max_size = 200M nel file php.ini.

Se si sta sviluppando su Windows come me, è possibile vedere un file di dump che mostra errori in C: \ Windows \ Temp chiamato come "php ** VERSION ** _ errors.log". Aiuta.

+0

Grazie per il ** enctype = "multipart/form-data" **, ha aiutato molto! –

3

Inviare una risposta perché la mia valutazione è troppo bassa.

Ricordarsi di riavviare il server dopo aver impostato il limite massimo di dimensioni del file nel php.ini. Ho passato ore su questo problema pensando che non si trattasse di un problema di dimensioni del file, nel frattempo mi sono dimenticato di riavviare. Dopo il riavvio, tutto ha funzionato.

Spero che questo possa aiutare qualcuno.

1

Ho affrontato il problema con $ _FILES campo 'tmp_name' senza valore per estensione .JPG e risolto con successo in pochi passaggi. Queste misure possono aiutare qualcuno in futuro.

  1. Prima di tutto, ho implementato la soluzione Switch Case offerta dall'utente "staticsan" . Link qui - https://stackoverflow.com/a/14472801/3681985. Questa soluzione mi ha aiutato a individuare potenziali problemi come i parametri nel file php.ini e le autorizzazioni della cartella .
  2. Il file php.ini è stato chiamato php.ini.default. La modifica dei parametri upload_max_filesize e post_max_size non ha prodotto alcun risultato, finché non ho rinominato il file in php.ini. Ricordati di sperimentare con i valori dei parametri.
  3. Dopo aver risolto il problema relativo al nome del file, ho riscontrato un problema con le autorizzazioni per la cartella in cui è necessario spostare l'immagine temporanea caricata. Ho cambiato le autorizzazioni e sono riuscito a vedere l'immagine caricata nella cartella.
Problemi correlati