2009-02-06 11 views
5

Sto usando questa linea per ottenere e salvare un'immagine da un URL.clausola di errore per file_put_contents

file_put_contents("./images/".$pk.".jpg", file_get_contents($PIC_URL)) 

Non sono sicuro di quale sia il modo migliore per gestire un errore. Al momento sta fallendo perché non c'è il permesso, che verrà risolto a breve, ma mi piacerebbe che fosse in grado di gestire situazioni in cui PIC_URL è vuoto o non un'immagine. Dovrei essere morto con l'errore a questo livello (probabilmente è meglio per le cose relative ai permessi) o dovrei controllare più in alto se PIC_URL è vuoto, o entrambi?

Qual è l'approccio migliore?

+0

L'unica osservazione che vorrei fare è che se allow_fopen_url = OFF è impostato sul server php.ini (come può essere in alcuni contesti di hosting condiviso), il tuo codice sopra fallirà. –

risposta

5

io non sono abbastanza talento per rivendicare questo è il metodo migliore, ma vorrei solo provare lungo la strada:

$imageDir = "/path/to/images/dir/"; 
$imagePath = "$imageDir$pk.jpg"; 
if (!is_dir($imageDir) or !is_writable($imageDir)) { 
    // Error if directory doesn't exist or isn't writable. 
} elseif (is_file($imagePath) and !is_writable($imagePath)) { 
    // Error if the file exists and isn't writable. 
} 

$image = file_get_contents(urlencode($PIC_URL)); 
if (empty($image)) { 
    // Error if the image is empty/not accessible. 
    exit; 
} 

file_put_contents($imagePath, $image); 
+0

si potrebbe anche voler controllare il valore di ritorno da file_put_contents() –

+0

correggimi se ho torto, ma i file_get_contents non lanciano ancora qualche livello di errore se non è possibile aprire il file? Potrebbe non essere fatale, ma è ancora un errore. –

+0

Non credo sia così, o almeno non è elencato nella documentazione: http://www.php.net/manual/en/function.file-get-contents.php Sfortunatamente, non lo faccio conoscere un modo per impostare un timeout in modo che lo script sia bloccato in attesa di un valore restituito se l'URL richiesto si blocca. – chuckg

0

Entrambi, per quanto mi riguarda. Soprattutto con quelle pericolose funzioni di gestione dei file, il doppio controllo non fa male. (Da dove viene il numero $pk?

In genere, controllare più in alto per un feedback migliore per l'utente e controllare prima di eseguire la sicurezza. È difficile dare un feedback decente all'utente quando controlla solo a basso livello. D'altra parte, è difficile controllare tutti i possibili errori (come quelli permessi del file system) a un livello alto e generico.

0

provare a fare una funzione per questo.

<?php 
define('OK', 0); 
deinfe('URL_EMPTY', 1); 
define('WRITING_PROBLEMS',2); 
define('OTHER_PROBLEM', 3); 


function save_pic($pic_url) { 

    $imageDir = '/path/to/images/dir/'; 

    if (!strlen($pic_url)) 
    return URL_EMPTY; 

    if (!is_dir($imageDir) || !is_writable($imageDir)) { 
    return WRITING_PROBLEMS; 
    } 

    $image = file_get_contents(urlencode($pic_url)); 

    $pk = time(); // or whatever you want as key 


    $r = file_put_contents($imagePath.$pk.".jpg", $pic_url); 

    if ($r) 
    return OK; 
    else 
    return OTHER_PROBLEM; 

} 
?> 
0

Hmm potrebbe non anche solo fare

file_put_contents($file, $str) or die("Unable to write file!");

Problemi correlati