Php dispone di diverse funzioni per la copia di file da server esterni. Tuttavia spesso accade che l'hosting su cui dobbiamo lavorare imponga delle restrittive regole di sicurezza. Con questa funzione e la libreria Curl possiamo copiare files e immagini con semplicità
Ecco una semplice ma utilissima funzione con la quale possiamo copiare files da server remoti.
Php dispone infatti di alcune funzioni adatte allo scopo (come file_get_contents() ) ma spesso i fornitori di hosting impongono delle regole di sicurezza restrittive che non permettono l'utilizzo di questi comandi su server esterni. Inoltre sono diverse le situazioni che possono compromettere l'operazione (file remoto inesistente, nostra directory protetta da scrittura, file già presente ecc).
Con questa funzione che ho preparato possiamo copiare files con relativa facilità:
function copyFromUrl($url,$directoryName,$fileName=''){
$return = array('result'=>'','error'=>'','warning'=>'');
if(!is_dir($directoryName)){
$return['result'] = 'error';
$return['error'] = 'La directory di destinazione non esiste.';
}
else{
if(!is_writable($directoryName)){
$return['result'] = 'error';
$return['error'] = 'La directory di destinazione non è scrivibile.';
}
else{
$saveto = $directoryName.'/'.$fileName;
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$raw=curl_exec($ch);
if($raw === false){
$return['result'] = 'error';
$return['error'] = curl_error($ch);
}
else{
if(file_exists($saveto)){
$return['warning'] = 'Esisteva già un file con questo nome, è stato eliminato per la sovrascrittura.';
unlink($saveto);
}
$fp = fopen($saveto,'x');
if($fp === false){
$return['result'] = 'error';
$return['error'] = 'Non è possibile creare il file. Controllare i permessi di scrittura.';
}
else{
fwrite($fp, $raw);
fclose($fp);
$return['result'] = 'success';
}
}
curl_close ($ch);
}
}
return $return;
}
la funzione riceve come primo parametro l'indirizzo del file da copiare, come secondo la directory di destinazione e come terzo il nome del file. Possiamo usare un percorso assoluto o relativo.
Al termine del processo viene restituito un array con tre valori:
- result (error o success)
- error (descrizione dell'eventuale errore)
- warning (eventuali warning, non bloccanti, rilevati durante il processo).
Esempio di utilizzo:
$result = copyFromUrl('http://www.linux.it/sites/all/themes/linuxday2/images/head_linux.png','/var/www/test','prova.jpg');
if($result['result'] == 'success'){
if(empty($result['warning'])){
echo 'Operazione conclusa con successo, nessun problema da rilevare.';
}
else{
echo 'Operazione conclusa con successo, ma attenzione: '.$result['warning'];
}
}
else{
echo 'Operazione non terminata. Codice errore: '.$result['error'];
}