Avatar billede learner Praktikant
08. juli 2012 - 10:24 Der er 16 kommentarer og
1 løsning

Funktion der tager kopi af billedfil remote

Hej

Jeg har lige siddet og arbejdet lidt på at lave en funktion som undersøger en url og hvis det er et img, så tager den en kopi af billedet og gemmer på min server.

Der skal ske følgende:
1. undersøg om det er en billedfil
2. hvis det er en billedfil:
2A. så tag en kopi
    gem den på min server i et bestemt dir med et bestemt navn
    fortæl i return om det lykkedes

hvis billedets x og y er forskellige, så vil jeg også gerne have resized billedet, men på en måde så den bevarer biledet og udfylder med hvid

Findes der en færdig funktion et sted som kan det hele? Ellers hvordan kan det så laves mest enkelt?

Jeg har arbejdet lidt med følgende, men jeg synes det er lidt for bøvlet. Håber det kan gøres meget enklere.

På forhånd tak

<?php
function makeRemoteThumbnail($o_file, $t_ht = 100, $new_filename, $new_filedir, $ratio_settings) {
    if (checkRemoteFile($o_file)){
   
        $image_info = getImageSize($o_file) ; // see EXIF for faster way
     
        switch ($image_info['mime']) {
            case 'image/gif':
                if (imagetypes() & IMG_GIF)  { // not the same as IMAGETYPE
                    $o_im = imageCreateFromGIF($o_file) ;
                } else {
                    $ermsg = 'GIF not supported';
                }
                break;
            case 'image/jpeg':
                if (imagetypes() & IMG_JPG)  {
                    $o_im = imageCreateFromJPEG($o_file) ;
                } else {
                    $ermsg = 'JPEG not supported';
                }
                break;
            case 'image/png':
                if (imagetypes() & IMG_PNG)  {
                    $o_im = imageCreateFromPNG($o_file) ;
                } else {
                    $ermsg = 'PNG not supported';
                }
                break;
            case 'image/wbmp':
                if (imagetypes() & IMG_WBMP)  {
                    $o_im = imageCreateFromWBMP($o_file) ;
                } else {
                    $ermsg = 'WBMP not supported';
                }
                break;
            default:
                $ermsg = $image_info['mime'].' not supported';
                break;
        } else {
            $ermsg = 'No image file found';
        }
    }
 
    if (!isset($ermsg)) {
        $o_wd = imagesx($o_im) ;
        $o_ht = imagesy($o_im) ;
        // thumbnail width = target * original width / original height
        $t_wd = round($o_wd * $t_ht / $o_ht) ;

        $t_im = imageCreateTrueColor($t_wd,$t_ht);
     
        imageCopyResampled($t_im, $o_im, 0, 0, 0, 0, $t_wd, $t_ht, $o_wd, $o_ht);
     
        imageJPEG($t_im);
     
        imageDestroy($o_im);
        imageDestroy($t_im);
        $ermsg = 'OK';
    }
    return $ermsg;
}
?>
Avatar billede learner Praktikant
08. juli 2012 - 10:25 #1
glemte denne:

<?php
function checkRemoteFile($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    // don't download content
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    if(curl_exec($ch)!==FALSE)
    {
        return true;
    }
    else
    {
        return false;
    }
}
?>
Avatar billede learner Praktikant
08. juli 2012 - 11:12 #2
det er ikke kønt, men jeg prøver lige det her:

function copyImageFromRemote($o_file, $new_filename, $t_ht = 100, $ratio_settings) {
    if ($o_file){
        if (checkRemoteFile($o_file)){
            $image_info = getImageSize($o_file) ; // see EXIF for faster way
            switch ($image_info['mime']) {
                case 'image/gif':
                    if (imagetypes() & IMG_GIF)  { // not the same as IMAGETYPE
                        //$o_im = imageCreateFromGIF($o_file) ;
                    } else {
                        return 'GIF not supported';
                    }
                    break;
                case 'image/jpeg':
                    if (imagetypes() & IMG_JPG)  {
                        //$o_im = imageCreateFromJPEG($o_file) ;
                    } else {
                        return 'JPEG not supported';
                    }
                    break;
                case 'image/png':
                    if (imagetypes() & IMG_PNG)  {
                        //$o_im = imageCreateFromPNG($o_file) ;
                    } else {
                        return 'PNG not supported';
                    }
                    break;
                case 'image/wbmp':
                    if (imagetypes() & IMG_WBMP)  {
                        //$o_im = imageCreateFromWBMP($o_file) ;
                    } else {
                        return 'WBMP not supported';
                    }
                    break;
                default:
                    return $image_info['mime'].' not supported';
                    break;
            } else {
                return 'No image found1';
            }
        } else {
            return 'No image found2';
        }
    } else {
        return 'No url defined';
    }
   
    if (!isset($ermsg)) {
       
        file_put_contents($new_filename, file_get_contents($o_file));

        return 'OK';
    }
    return $ermsg;
}
Avatar billede olebole Juniormester
08. juli 2012 - 15:55 #3
<ole>

"det er ikke kønt, men jeg prøver lige det her:"

- ehhhhh, er det en del af din dagbog, eller er det noget, vi forventes at forholde os til? I så fald ved jeg ikke rigtig, hvad jeg skal stille op med det  =)

I princippet kan du kopiere billedet sådan:

<?php
function copyRemoteFile($sFileName, $sNewFileName) {
    $allowedExts = array(
        'png' => 1,
        'jpg' => 1,
        'jpeg' => 1,
        'gif' => 1
    );
    $sExt = strtolower(end(explode('.', $sFileName)));
    if (!isset($allowedExts[$sExt])) return; // Ikke tilladt extension
   
    file_put_contents($sNewFileName .= '.'.$sExt, file_get_contents($sFileName));
}

copyRemoteFile('http://www.eksperten.dk/images/eksperten_logo.gif', 'foobar');
?>

- og så kan du ellers manipulere det, som du lyster  =)

/mvh
</bole>
Avatar billede olebole Juniormester
08. juli 2012 - 15:56 #4
<?php
function copyRemoteFile($sFileName, $sNewFileName) {
    $allowedExts = array(
        'png' => 1,
        'jpg' => 1,
        'jpeg' => 1,
        'gif' => 1
    );
    $sExt = strtolower(end(explode('.', $sFileName)));
    if (!isset($allowedExts[$sExt])) return; // Ikke tilladt extension
   
    file_put_contents($sNewFileName .= '.'.$sExt, file_get_contents($sFileName));
}

copyRemoteFile('http://www.eksperten.dk/images/eksperten_logo.gif', 'foobar');
?>
Avatar billede olebole Juniormester
08. juli 2012 - 15:58 #5
Pokkers, som jeg kan lave fejl!  :o|

<?php
function copyRemoteFile($sFileName, $sNewFileName) {
    $allowedExts = array(
        'png' => 1,
        'jpg' => 1,
        'jpeg' => 1,
        'gif' => 1
    );
    $sExt = strtolower(end(explode('.', $sFileName)));
    if (!isset($allowedExts[$sExt])) return; // Ikke tilladt extension
   
    file_put_contents($sNewFileName.'.'.$sExt, file_get_contents($sFileName));
}

copyRemoteFile('http://www.eksperten.dk/images/eksperten_logo.gif', 'foobar');
?>
Avatar billede learner Praktikant
08. juli 2012 - 18:35 #6
Tusind tak :) Dejligt enkelt

Jeg ved godt du har løst opgaven, men kan du evt os hjælpe mig me at få den til altid at gemme filen med samme bredde som højde?

For eksempel hvis originalfilen er 600x500, så kunne jeg godt tænke mig at den blir gemt som 600x600 og fylde resten med hvid baggrund.
Avatar billede DeeDawg Nybegynder
09. juli 2012 - 16:19 #7
Det kan jeg da komme med et bud på. :)

<?php
function copyRemoteFile($sFileName, $sNewFileName) {
    $allowedExts = array(
        'png'  => 1,
        'jpg'  => 1,
        'jpeg' => 1,
        'gif'  => 1
    );
   
    $sExt = strtolower(end(explode('.', $sFileName)));
    if (!isset($allowedExts[$sExt])) return; // Ikke tilladt extension
   
    $file = $sNewFileName.'.'.$sExt;
    $sExt = ($sExt == 'jpg' ? 'jpeg' : $sExt);
   
    list ($width, $height) = getimagesize($sFileName);
    if ($width != $height) {
        $size = max($width, $height);
        $original = call_user_func('imagecreatefrom'.$sExt, $sFileName);
        $new = imagecreatetruecolor($size, $size);
        $color = imagecolorallocate($new, 255, 255, 255);
        imagefill($new, 0, 0, $color);
       
        if (($width / $height) >= 1) {
            $dst_h = $height * ($size / $width);
            $dst_w = $size;
            $dst_x = 0;
            $dst_y = round(abs($size - $dst_h) / 2);
        } else {
            $dst_h = $size;
            $dst_w = $width * ($size / $height);
            $dst_x = round(abs($size - $dst_w) / 2);
            $dst_y = 0;
        }
       
        imagecopyresized($new, $original, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $width, $height);
        call_user_func('image'.$sExt, $new, $file);
        imagedestroy($original);
        imagedestroy($new);
       
        return true;
    }
   
    file_put_contents($file, file_get_contents($sFileName));
}

copyRemoteFile('http://www.eksperten.dk/images/eksperten_logo.gif', 'foobar');
?>
Avatar billede olebole Juniormester
09. juli 2012 - 16:36 #8
Eller denne her, som jeg som vanligt ikke kunne skrive i nat  :o|

<?php
function copyRemoteFile($sFileName, $sNewFileName) {
    $allowedExts = array(
        'png' => 1,
        'jpg' => 1,
        'jpeg' => 1,
        'gif' => 1
    );
    $sExt = strtolower(end(explode('.', $sFileName)));
    if (!isset($allowedExts[$sExt])) return; // Ikke tilladt extension
   
    $oCopy = imagecreatefromgif($sFileName);
    $aInfo = getimagesize($sFileName);
    $nSideLength = max($aInfo[0], $aInfo[1]);
   
    $oIm = imagecreatetruecolor($nSideLength, $nSideLength);
    $oCol = imagecolorallocate($oIm, 255, 255, 255);
    imagefill($oIm, 0, 0, $oCol);
   
    $nTop = $aInfo[1]<$nSideLength ? ($nSideLength-$aInfo[1])/2 : 0;
    $nLeft = $aInfo[0]<$nSideLength ? ($nSideLength-$aInfo[0])/2 : 0;
    imagecopymerge($oIm, $oCopy, $nLeft, $nTop, 0, 0, $aInfo[0], $aInfo[1], 100);

    $savedImg = imagegif($oIm, $sNewFileName.'.'.$sExt);
}

copyRemoteFile('http://www.eksperten.dk/images/eksperten_logo.gif', 'foobar');
?>
Avatar billede DeeDawg Nybegynder
09. juli 2012 - 17:03 #9
Arh, olebole. Man kan jo ikke være doven og benytte gif på det hele. Typen er vigtig, for ellers kommer der jo kun en hvid firkant ud af det. :)
Avatar billede olebole Juniormester
09. juli 2012 - 17:20 #10
Ooops, det glemte da jeg helt at lave færdigt! Jaja, det var også sent - og langt over aldrende herrers sengetid  :D

Jeg er på vej ud af døren, men det kan være, jeg lige kikker på det senere  =)
Avatar billede olebole Juniormester
09. juli 2012 - 19:25 #11
Et hurtigt bud kunne være:

<?php
function copyRemoteFile($sFileName, $sNewFileName) {
    $allowedExts = array(
        'png' => 'imagepng',
        'jpg' => 'imagejpeg',
        'jpeg' => 'imagejpeg',
        'gif' => 'imagegif'
    );
    $sExt = strtolower(end(explode('.', $sFileName)));
    if (!isset($allowedExts[$sExt])) return; // Ikke tilladt extension
   
    $oCopy = imagecreatefromgif($sFileName);
    $aInfo = getimagesize($sFileName);
    $nSideLength = max($aInfo[0], $aInfo[1]);
   
    $oIm = imagecreatetruecolor($nSideLength, $nSideLength);
    $oCol = imagecolorallocate($oIm, 255, 255, 255);
    imagefill($oIm, 0, 0, $oCol);
   
    $nTop = $aInfo[1]<$nSideLength ? ($nSideLength-$aInfo[1])/2 : 0;
    $nLeft = $aInfo[0]<$nSideLength ? ($nSideLength-$aInfo[0])/2 : 0;
    imagecopymerge($oIm, $oCopy, $nLeft, $nTop, 0, 0, $aInfo[0], $aInfo[1], 100);
    $savedImg = $allowedExts[$sExt]($oIm, $sNewFileName.'.'.$sExt);
}

copyRemoteFile('http://www.eksperten.dk/images/eksperten_logo.gif', 'foobar');
?>
Avatar billede DeeDawg Nybegynder
10. juli 2012 - 04:57 #12
Psst.. :)

$oCopy = imagecreatefromgif($sFileName);
Avatar billede olebole Juniormester
10. juli 2012 - 15:42 #13
DIN TRESTJERNEDE DETALJEPEDANT ...!!!  *ROTFLMAO*  :D

Jaja, jeg må vist hellere kikke lidt på den kode med vågne, ikke-travle øjne lidt senere  *D

- og under alle omstændigheder, er din kode absolut fin og udmærket. Var jeg spørger, ville jeg nok bruge den - i stedet for at sidde og vente på et gammelt, synssvækket koderodeho'de  *o)
Avatar billede DeeDawg Nybegynder
10. juli 2012 - 16:03 #14
Haha, ej det er heller ikke helt fair. Du skrev at det var et hurtigt bud. :)
Avatar billede olebole Juniormester
10. juli 2012 - 16:26 #15
Jo, gu' er det fair. Jeg er jo ikke ligefrem den sidste til at give en kode en 'kærlig' begmand  *o)

Ja, det var et hurtigt bud - og egentlig en ganske 'sexy' redning af et ufærdigt testscript  =)

Note2me: "Det er fint at tætne koøjet - men tjek lige, om bundproppen sidder i!"  :D
Avatar billede learner Praktikant
05. oktober 2012 - 15:21 #16
Hej

Mange tak for hjælpen, jeg har brugt function copyRemoteFile() og det virker bare som det skal.

Smid svar begge to, så lukker jeg tråden

Endnu en gang tak for hjælpen :o)
Avatar billede olebole Juniormester
05. oktober 2012 - 15:31 #17
Ellers tak, de må være DeeDawgs'  =)
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