Donwload immagine da url specificato...in una cartella del proprio pc...

pagliacciopazzo

Nuovo Utente
16 Mag 2010
1
0
0
Salve a tutti
questo è il mio primo post... ma spero sia il primo di tanti visto che mi sono avvicinato al mondo php già da un pò e questo mi appassiona molto!!!
D'altra parte giracchio sul sito già da almeno un annetto: da voi ho appreso le basi sull'HTML, XML e adesso anche del PHP
Comunque veniamo a noi...
Sto realizzando uno script semplice semplice che mi dovrebbe consentire di fare il download di una immagine di cui possiedo l'URL direttamente sul pc ovviamente posizionandola su una cartella da ne specificata.
Già anticipo che, essendo alle prime armi, con qualche difficoltò, sul web ho individuato parti di script mettendoli insieme e caricati su uno spazio web di altervista.
Il risultato è che mi scarica l'immagine sul web server senza dargli alcuna dimensione...quindi neanche leggibile...

...ma io la voglio sul mio pc!!!
Ho capito che sicuramente sbaglio nell'indicare la destinazione ma ho provato di tutto.

Di seguito riporto il mio lavoro:

<?php
if (isset($_POST[dom])){
$root=str_replace($_SERVER["PHP_SELF"],"",$_SERVER["SCRIPT_FILENAME"]);//gia' presente all'inizio
$my_save="C:\Documents and Settings\Administrator\Desktop\IMACROS";//scrivere qui la directory, con permessi 775, in cui intendiamo salvare le immagini
function get_data($url)
{//preleva la pagina web data da $url
$ch = curl_init();//inizializza una nuova sessione e restituisce l'handle $ch
$timeout = 10;//5
curl_setopt($ch,CURLOPT_URL,$url);//$url e' l'URL che si desidera far salvare da PHP
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//con 1 per ottenere il trasferimento invece di stamparlo.
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);//fissa il timeout
$data = curl_exec($ch);//acqisisce il contenuto di URL in $data
curl_close($ch);//termina la sessione curl
return $data;//resituisce il contenuto di URL
}
echo "<h1>Elenco Immagini salvate in directory target</h1>";
$dom = $_POST[dom];
$ste = parse_url($dom);//acquisisce parti URL in array $ste
$sito = "http://".$ste[host];//acquisisce hostname dell'URL in $sito
$source=get_data($dom);//legge il contenuto della pagina Web
$doc = new DOMDocument;//alloca lo spazio per contenere un documento
$doc->loadHTML($source);//carica il documento $source
$xpath = new DOMXPath($doc);//inizializza la funzione query per processare il documento $doc
$nodo = $xpath->query('//img[@src]');//seleziona i tag img
$n=0;

foreach ($nodo as $nodo){
$n++;
$imgsrc = $nodo->getAttribute('src');//aquisisce valore di src nel tag img
$ste=parse_url("$imgsrc");
$hostsrc=$ste[host];
//echo "$imgsrc ";
if(empty($hostsrc)){//se non inizia col nome host del sito forma il corretto URL
if(substr($imgsrc,0,2) == "./"){
$imgsrc=$sito.substr($imgsrc,1);
//echo "trasformo in $imgsrc";
}
else if (substr($imgsrc,0,1) == "/"){
$imgsrc="$sito$imgsrc";
//echo "trasformo in $imgsrc";
}
else{
$imgsrc="$sito/$imgsrc";
//echo "trasformo in $imgsrc";
}
}
$nome_file=urlencode(basename("$imgsrc"));
$file_target=$my_save.$nome_file;
$target=$root.$file_target;
$size = getimagesize($imgsrc);//prende info immagine
$X = $size[0]; //larghezza immagine<br />
$Y = $size[1]; //altezza immagine<br />
$file_type= $size['mime'];//tipo di immagine
if("$file_type" == "image/pjpeg" || "$file_type" == "image/jpeg"){
$img=imagecreatefromjpeg($imgsrc);
$file_target=$file_target.".jpg";
imagejpeg ($img, $target.".jpg",100);// 100 stabilisce la max qualita' dell'immagine, 75 e' un buon compromesso tra qualita' e occupazione spazio
}
else if("$file_type" == "image/x-png" || "$file_type" == "image/png"){
$img=imagecreatefrompng($imgsrc);
$file_target=$file_target.".png";
imagealphablending($img, false);
imagesavealpha ($img, true);//imagealphablending e imagesavealpha per mantenere la trasparenza delle png
imagepng ($img, $target.".png",0);//livello di compressione variabile da 0 (nessuna compressione) a 9 (max compressione)
}
else if("$file_type" == "image/gif"){
$img=imagecreatefromgif($imgsrc);
$file_target=$file_target.".gif";
imagegif ($img,$target.".gif");
}
echo "<img src=\"$file_target\" alt=\"$nome_file\" title=\"$nome_file\" border=\"1\"> ";
imagedestroy($img);

}
echo "<hr>";
}
?>
<h3>Per acquisire immagini da una pagina Web e salvarle in una propria Directory</h3>
<form name="form1" method="post" action="" >
Nome completo della pagina Web: <input type="text" name="dom" value="http://">
<input type="submit" value="Invia">
</form>


Questo è tutto...
attendo consigli e istruzioni per risolvere questo problema ma soprattutto accetto consigli per rendere più facile i miei studi sul php...
Grazie
Fabio
:)
PS: ma questi permessi 775 cosa sarebbero precisamente?
 
Guarda, la soluzione al tuo problema è molto semplice: non c'è nessuna soluzione. Infatti, per ovvie ragioni di sicurezza, non puoi scaricare in maniera trasparente un file sul computer dell'utente, in nessun linguaggio di scripting/programmazione. E in PHP diventa impossibile anche per questioni tecniche, essendo un linguaggio interpretato dal server e non dal client. Al massimo puoi forzare il download del file, ma comunque l'utente dovrà decidere se scaricarlo o meno. A questo proposito ti consiglio di dare un'occhiata a questo articolo: https://www.mrw.it/php/articoli/forzare-download-file-php_963.html.

Ti presento un esempio di come potrebbe essere il tuo script:
PHP:
<?php
// nome del file (input/outpuut)
$input = 'http://www.nomesito.com/immagine.jpg';
$output = pathinfo($input, PATHINFO_FILENAME) . pathinfo($input, PATHINFO_EXTENSION);

// inizializzo cURL
$ch = curl_init();

// imposto le opzioni
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $file);

// eseguo il download
$contents = curl_exec($ch);

// imposto gli header
header('Cache-Control: public');
header('Content-Disposition: attachment; filename= ' . $output);
header('Content-Transfer-Encoding: binary');

// invio i dati
echo $contents;
?>
 
Ultima modifica:
da neofita sarei interessato anche io ad una cosa simile, ma anzichè scaricare l'immagine nel pc, mi servirebbe scaricarla in una cartella del server dichiarata da me.
uso questo script trovato nel web ed effettivamente esegue la procedura e scarica l'immagine nella cartella dove risiede lo script , ma c'è un piccolo particolare l'immagine salvata ha un peso 0 kb, quindi non valida, ora michiedo è colpa dello script o del server ??
il server è altervista con curl e fsockopen abilitati.
un altra cosa cosa va modificato per cambiare la cartella di destinazione ?
grazie.

Codice:
<?php

//function to get image with fsockopen
function GetImg($host,$link)
{
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr (error number $errno)
\n";
} else {
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
$out .= "Accept-Language: en-us,en;q=0.5\r\n";
$out .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
$out .= "Keep-Alive: 300\r\n";   
$out .= "\r\n";
fwrite($fp, $out);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}

//function to get image with CURL
function GetImageFromUrl($link)
 
{
 
$ch = curl_init();
 
curl_setopt($ch, CURLOPT_POST, 0);
 
curl_setopt($ch,CURLOPT_URL,$link);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 
$result=curl_exec($ch);
 
curl_close($ch);
 
return $result;
 
} 
//1. Method file_Get contents
$contents= file_get_contents('http://www.google.com/intl/en_ALL/images/logo.gif');
//2.Method fsockopen
	//$contents=GetImg("www.google.com","/intl/en_ALL/images/logo.gif");
	//$contents=strchr($contents,"\r\n\r\n");//removes headers
	//$contents=ltrim($contents);//remove whitespaces from begin of the string
//3. Method CURL
	//$contents = GetImageFromUrl("http://www.google.com/intl/en_ALL/images/logo.gif");
$savefile = fopen('image.jpg', 'w');
fwrite($savefile, $contents);
fclose($savefile);

?>
 

Discussioni simili