Avatar billede tcp Nybegynder
29. august 2009 - 13:11 Der er 10 kommentarer og
1 løsning

Download et billede fra http med php kode

Hejsa er der en der kan pege mig i den rigtige retning....


Jeg har i min database 13.000 - 14.000 adresser på billeder
som jeg skal have downloadet da siderne ikke længere tillader hotlink, har tilladelse til at hente billeder. men hvordan gør jeg det nemmest


skal bare have dem ned på min server/thombs/billede-navn.jpg
Avatar billede olebole Juniormester
29. august 2009 - 15:12 #1
<ole>

Du kunne gøre noget i stil med:


<?php
$sPath2folder = "downloads/";

$aUrls = array(
    "http://www.eksperten.dk/images/eksperten_logo.gif",
    "http://www.google.dk/intl/en_com/images/logo_plain.png",
    "http://dengodekode.dk/xhtml/xhtml.jpg"
);

for ($i=0,$j=count($aUrls); $i<$j; $i++) {
    $sUrl = $aUrls[$i];
    $sName = preg_replace("#^http://(www\.)?(.+?)$#", "$2", $sUrl);
    $aName = explode(".", $sName);
    $sExt = array_pop($aName);
    $sName = implode("_", $aName);
    $sName = str_replace("/", "_", $sName).".".$sExt;
   
    $sPic = file_get_contents($sUrl);
    $fp = fopen($sPath2folder.$sName, "w");
    fwrite($fp, $sPic);
    fclose($fp);
}
?>



Hvor $aUrls er et array af billed URL'er, fremkommet ved udtræk fra din DB.

Eksemplet resulterer i tre billeder i mappen downloads, som ligger ved siden af filen med scriptet - og tillader scriptet at skrive. Filerne kommer til at hedde:

eksperten_dk_images_eksperten_logo.gif
google_dk_intl_en_com_images_logo_plain.png
dengodekode_dk_xhtml_xhtml.jpg


Det tager tid at hente så mange billeder, så hvis du bruger denne model, bør du opdele jobbet i mange kald til scriptet og hente et mindre antal billeder ad gangen. Under alle omstændigheder bør du kikke på:
    http://dk2.php.net/manual/en/function.set-time-limit.php

En langt bedre løsning ville være at lave en klasse, som når et objekt instantieres kan hente ét billede.

Du kan så have et array med 15.000 URL'er - og et tomt array $aActive, der skal indeholde de til enhver tid aktive objekt instanser. Du har desuden en funktion fetchPics, som instantierer objekter og hælder dem i $aActive, indtil dette array har f.eks. 20 elementer.

Hvergang et objekt er færdig med at kopiere et billede, fjerner det sig selv fra $aActive og kalder fetchPics.

På den måde henter du flere billeder på én gang - og begrænser samtidig antallet af åbne forbindelser til et fornuftigt niveau. Men det kræver, du programmerer OO. Nu har du i hvertfald en skitse  =)

/mvh
</bole>
Avatar billede olebole Juniormester
29. august 2009 - 15:16 #2
Du kan lave alle mulige regler for navngivningen. Jeg valgte denne, fordi den formodentlig kan lette rettelser af links i dine dokumenter og/eller database
Avatar billede olebole Juniormester
29. august 2009 - 15:17 #3
PS: og du undgår navnekonflikter  ;o)
Avatar billede tcp Nybegynder
31. august 2009 - 13:33 #4
Hejsa ole det er jo et super arbejde du har lagt i dette spørgsmål og takker mange gange.

Jeg må så lige prøve om jeg kan få rettet det til.

i databasen har jeg jo alle de rigtige url eks

http://klsjghsdfjkghdfj.dk/images/f300/1.jpg
http://klsjghsdfjkghdfj.dk/images/f310/1.jpg
http://klsjghsdfjkghdfj.dk/x10/1000300/1.jpg

og det ville gøre det en del nemmere hvis den gemmer billederne

downloads/images/f300/1.jpg
downloads/x10/1000300/1.jpg
downloads/images/f310/1.jpg

For så slipper jeg for at rette i mit udtræk andet end at skifte url til Http://mitdomæne.dk/downloads/samme billede navn som altid

Kan du følge mig
Avatar billede olebole Juniormester
31. august 2009 - 14:13 #5
Jeg er på arbejde lige nu, men jeg kikker på det i aften og vender tilbage med et forslag  ;o)
Avatar billede olebole Juniormester
31. august 2009 - 21:34 #6

<?php
$sPath2folder = "downloads";

$aUrls = array(
    "http://www.eksperten.dk/images/eksperten_logo.gif",
    "http://www.google.dk/intl/en_com/images/logo_plain.png",
    "http://dengodekode.dk/xhtml/xhtml.jpg"
);

$aLog = array();

for ($i=0,$j=count($aUrls); $i<$j; $i++) {
    $sUrl = $aUrls[$i];
    $sShortUrl = preg_replace("#^http://(.+?)$#", "$1", $sUrl);
    $aUrl = explode("/", $sShortUrl);
   
    $sDir = $sPath2folder;
    for ($m=1,$n=count($aUrl)-1; $m<$n; $m++) {
        $sDir = $sDir."/".$aUrl[$m];
        if (!is_dir($sDir)) mkdir($sDir);
    }
    $sName = $sDir."/".end($aUrl);
   
    // Hvis filen eksisterer, så giv den
    // et nyt navn og log begge navne
    if (is_file($sName)) {
        $sRnd = "p".mt_rand(0, 10000)."_";
        $sNewName = $sDir."/".$sRnd.end($aUrl);
        $aLog[] = $sName."  ->  ".$sNewName;
        $sName = $sNewName;
    }
   
    $sPic = file_get_contents($sUrl);
    $fp = fopen($sName, "w");
    fwrite($fp, $sPic);
    fclose($fp);
}

// Skriv til i logfilen og udskriv denne kørsels dupplikater
if (count($aLog)>0) {
    $fp = fopen("log.txt", "a");
    $sLog = implode("\r\n", $aLog)."\r\n";
    fwrite($fp, $sLog);
    fclose($fp);
   
    print "<h3>Har ændret flg. filnavne:</h3><div>".implode("</div><div>", $aLog)."</div>";
}
?>



NB: Læg mærke til, at den afsluttende slash i stien til download mappen er slettet!

Scriptet løber igen array'et igennem. Hver URL strippes for http://, og der oprettes et array ved at eksplodere over en slash.

I hvert gennemløb kører vi en ekstra løkke, hvor vi tjekker, om mapperne eksisterer lokalt - og opretter dem, hvis de ikke gør.

Hvis to billeder under to forskellige domæner hedder det samme og ligger i mappen images, som ligger i roden, føjes p12365_ foran selve filnavnet. Tallet er et tilfældigt tal mellem 0 og 10.000, hvilket formodentlig er nok til at undgå overskrivning.

Samtidigt med omdøbningen skrives navnene ind i et array på formen:

$aLog[] = images/billede.jpg  ->  images/p9812_billede.jpg


Når alle billeder i array'et er hentet, skrives loggen ud til browseren. Desuden skrives til i en logfil ved navn log.txt. Da du jo sikkert kører mange filkørsler, skrives loggen for hver kørsel til i logfilen. Logfilen overskrives ikke ved hver kørsel.

Du kan jo teste ved at køre eksemplet ovenfor tre-fire gange
Avatar billede olebole Juniormester
31. august 2009 - 21:41 #7
Njarrrhhhh ... linjerne i loggen skrives ud på formen:

$aLog[] = downloads/images/billede.jpg  ->  downloads/images/p9812_billede.jpg


- og så sdavøs duplikater forøvrigt med ét p  ;o)
Avatar billede tcp Nybegynder
03. september 2009 - 21:32 #8
Det er jo et super lille script, og det virker 100% til formålet jeg takker mange gange.
Avatar billede olebole Juniormester
03. september 2009 - 22:27 #9
Selvtak. Så lægger jeg et svar  =)
Avatar billede olebole Juniormester
03. september 2009 - 22:46 #10
Tak for points  =)
Avatar billede tcp Nybegynder
03. september 2009 - 22:51 #11
Det er mig der takker og bukker :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester