Avatar billede foxwell Nybegynder
15. december 2004 - 14:48 Der er 31 kommentarer og
1 løsning

arbejde med billeder fra anden server

Jeg har et PHP script der, via GD, kan tage et uploadet billede og beskære det efter nogle angivne mål, og så gemme det nye billede i en anden mappe.

Jeg vil gerne kunne arbejde direkte med et billede som findes på et andet website ved at fodre den fulde sti til billedet til mit script, som så gemmer en kopi af billedet på min server, så det derefter kan bearbejdes...

Er det muligt i PHP at fodre stien til et billede (på en anden server) til et script og så få det script til at gemme en lokal kopi?

//foxwell
Avatar billede morteeart Nybegynder
15. december 2004 - 14:54 #1
<?php


if(isset($_FILES['fil']['tmp_name']))
{
  $src = $_FILES['fil']['tmp_name'];
  $ext = strtolower(end(explode(".", $_FILES['fil']['name'])));
  if($ext != "jpg")
  {
  die("Billedet er ikke i jpg format, og kan derfor ikke uploadet pga. skalering kun virker på jpg formatet.  ");   
  }
  $tid = time();
  $nytNavn = $tid . "." . $ext;
  $image = $src;

  if(file_exists($image))
  {
    $imgsize = getimagesize($image);
    if($imgsize[0] > 100)
    {
      $width = 100;
      $height = $imgsize[1] / ($imgsize[0] / 100);
      $dst_img = imagecreatetruecolor($width,$height);
      $src_img=ImageCreateFromJpeg($image);
      ImageCopyResampled($dst_img,$src_img,0,0,0,0,$width,$height,ImageSX($src_img),ImageSY($src_img));
      ImageJpeg($dst_img, "./galleri/thumbs/" . $nytNavn);
      copy($image,"./galleri/".$nytNavn);
    }
    else
    {
      $src_imga=ImageCreateFromJpeg("$image");
      ImageJpeg($src_imga, "./galleri/" . $nytNavn);
    }
  }
die("Billedet er nu uploadet.");
}
else
{
?>
<br>
<form enctype="multipart/form-data" action="<?= $_SERVER['REQUEST_URI']; ?>" method="post">
<table cellspacing="2" cellpadding="2" border="0">
<tr>
    <td>
        Vælg fil:</td>
    <td>
        <input name="fil" type="file">
    </td>
</tr>

<tr>
    <td colspan="2"><input type="submit" value="Upload Billed"> </td>
</tr>
</table>
</form>
<?
}
?>
Avatar billede coderdk Praktikant
15. december 2004 - 14:56 #2
$im = imagecreatefromjpeg("http://www.jpeg.org/images/blue_large_05.jpg");
// lav ting ved billedet
// gem lokalt:
imagejpeg( $im, "lokalfil.jpeg", 100 );
Avatar billede foxwell Nybegynder
15. december 2004 - 16:07 #3
morteeart > så vidt jeg kan se er dette bare et script til at generere thumbnails... det har jeg allerede, jeg ville arbejde med billeder der hentes direkte fra et andet site, ikke med noget der skal uploades først...

coderdk > der ser godt ud, men jeg kan ikke få det til at virke... kan det tænkes at det er et problem med allow_url_fopen i serveropsætningen? serveren er sat til "no value"... I så fald er det ikke noget jeg kan ændre på, så er der en anden måde at gøre det på?
Avatar billede coderdk Praktikant
15. december 2004 - 16:17 #4
Hmm ja det kræver allow_url_fopen... Så du kan heller ikke bruge file_get_contents osv... Kan du bruge fsockopen osv?
Avatar billede foxwell Nybegynder
15. december 2004 - 16:22 #5
muligvis, er ikke helt sikker. står ikke noget om den under server info, men ved ikke hvordan den virker...
Avatar billede coderdk Praktikant
15. december 2004 - 16:25 #6
For at teste kan du prøve:

if ( $fp = fsockopen( "google.com", 80, $en, $es, 10 ) )
{
  $out = "GET /search?q=test HTTP/1.1\r\n";
  $out .= "Host: www.google.dk\r\n";
  $out .= "Connection: Close\r\n\r\n";

  fwrite( $fp, $out );
  while ( !feof( $fp ) )
  {
      echo fgets( $fp, 512 );
  }
  fclose( $fp );
}
else
{
  echo "Damn. $en: $es"
}
Avatar billede foxwell Nybegynder
15. december 2004 - 16:30 #7
ok syret, der kom et fint google site frem i vinduet =) (minus grafik) - går ud fra at det betyder at det virker? =)
Avatar billede coderdk Praktikant
15. december 2004 - 16:34 #8
Yeps ;)
Avatar billede foxwell Nybegynder
15. december 2004 - 16:36 #9
men hvordan får man den til at hente et specifikt billede? bliver det ikke herre besværligt men at skulle splitte adressen på billedet i host og mapper/fil, osv? Prøvede at modificere din kode lidt til at hente et billede fra min server, men det er ren volapyk jeg får tilbage...
Avatar billede coderdk Praktikant
15. december 2004 - 18:03 #10
Dette virker ;)

<?php

    if ( $fp = fsockopen( "www.jpeg.org", 80, $en, $es, 10 ) )
    {
      $out = "GET /images/blue_large_05.jpg HTTP/1.1\r\n";
      $out .= "Host: www.jpeg.org\r\n";
      $out .= "Connection: Close\r\n\r\n";

      fwrite( $fp, $out );
      $fil = '';
      while ( !feof( $fp ) )
      {
          $fil .= fread( $fp, 512 );
      }
      preg_match( "/^.*\r?\n\r?\n(.*)$/s", $fil, $match );
      fclose( $fp );
      $fp = fopen( "nyfil.jpg", "wb" );
      fwrite( $fp, $match[1] );
      fclose( $fp );
    }
    else
    {
      echo "Damn. $en: $es";
    }

?>
Avatar billede coderdk Praktikant
15. december 2004 - 18:23 #11
Eller en pæn funktion:

    function saveImg( $url, $fil )
    {
        if ( preg_match( "/^http:\/\/(.*?):?(\d+)?(\/.*)$/i", $url, $m ) )
        {
            list( $x, $host, $port, $path ) = $m;
            $port = ( $port != '' ? $port : 80 );
        }
        else
        {
            die( "Giv en URL!" );
        }
        if ( $fp = fsockopen( $host, $port, $en, $es, 10 ) )
        {
          $out = "GET $path HTTP/1.1\r\n";
          $out .= "Host: $host\r\n";
          $out .= "Connection: Close\r\n\r\n";

          fwrite( $fp, $out );
          $fil = '';
          while ( !feof( $fp ) )
          {
              $fil .= fread( $fp, 512 );
          }
          preg_match( "/^.*\r?\n\r?\n(.*)$/s", $fil, $match );
          fclose( $fp );
          $fp = fopen( $fil, "wb" );
          fwrite( $fp, $match[1] );
          fclose( $fp );
          return true;
        }
        else
        {
            return false;
        }
    }

bruges sådan:

    getImg( "http://www.jpeg.org/images/blue_large_05.jpg", "nyfil.jpg" );
Avatar billede foxwell Nybegynder
16. december 2004 - 00:26 #12
wow, mange tak =) det ser super ud, sidder og arbejder med din fine kode og prøver at få det til at virke. Tror der er en fejl i din første regex (kaster fejl selvom den får gyldige URLs), men jeg prøver selv at finde den =) surt at jeg er så skidt til regex... =(

tusind tak for hjælpen =)
Avatar billede foxwell Nybegynder
16. december 2004 - 02:20 #13
ok, tror ikke der var noget fejl i regex'en alligevel, jeg kunne bare ikke finde ud af at læse den (jeg bruger dit script #2 med den pæne funktion). Jeg får følgende fejl når jeg fodrer din funktion med "http://www.catinatree.com/images/animals/cthulhu-pullat.jpg" og "test.php":

Warning: fopen("HTTP/1.1 200 OK Date: Thu, 16 Dec 2004 01:18:03 GMT Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) Chili!Soft-ASP/3.6.2 FrontPage/4.0.4.3 mod_auth_pgsql/0.9.12 Last-Modified: Tue, 14 Dec 2004 22:29:11 GMT ETag: "a590e5-fd5a-41bf6937" Accept-Ranges: bytes Content-Length: 64858 Connection: close Content-Type: image/jpeg ÿØÿà", "wb") - No such file or directory in /blah/blah/blah/filnavn.php on line 23

Warning: fwrite(): supplied argument is not a valid File-Handle resource in /blah/blah/blah/filnavn.php on line 24

Warning: fclose(): supplied argument is not a valid File-Handle resource in /blah/blah/blah/filnavn.php on line 25

Ser ud som om at der er lidt problemer med $fil, men kan ikke se hvad de er... filfunktioner er bestemt ikke min force kan jeg mærke =)
Avatar billede coderdk Praktikant
16. december 2004 - 02:22 #14
Det er jo fordi jeg har sovet i timen ;) Her er en opdateret en, uden sammenfald i navne ;)

    function saveImg( $url, $udfil )
    {
        if ( preg_match( "/^http:\/\/(.*?):?(\d+)?(\/.*)$/i", $url, $m ) )
        {
            list( $x, $host, $port, $path ) = $m;
            $port = ( $port != '' ? $port : 80 );
        }
        else
        {
            die( "Giv en URL!" );
        }
        if ( $fp = fsockopen( $host, $port, $en, $es, 10 ) )
        {
          $out = "GET $path HTTP/1.1\r\n";
          $out .= "Host: $host\r\n";
          $out .= "Connection: Close\r\n\r\n";

          fwrite( $fp, $out );
          $fil = '';
          while ( !feof( $fp ) )
          {
              $fil .= fread( $fp, 512 );
          }
          preg_match( "/^.*\r?\n\r?\n(.*)$/s", $fil, $match );
          fclose( $fp );
          $fp = fopen( $udfil, "wb" );
          fwrite( $fp, $match[1] );
          fclose( $fp );
          return true;
        }
        else
        {
            return false;
        }
    }
Avatar billede foxwell Nybegynder
16. december 2004 - 02:23 #15
BTW, jeg har en lokal kopi af det billede jeg prøver at åbne, og det er præcist lige så stort som det scriptet siger den har fundet: Accept-Ranges: bytes Content-Length: 64858... så det ser ud som om at den finder billedet fint, men bliver forvirret af nogle header-infos (tror jeg)...
Avatar billede foxwell Nybegynder
16. december 2004 - 02:28 #16
genialt, nu virker det som en drøm! =) mange mange tak for hjælpen (og sov godt!)

=))

//foxwell
Avatar billede foxwell Nybegynder
16. december 2004 - 02:29 #17
for en god ordens skyld lægger jeg lige koden til testsiden ud (den er 100% din kode bare med en formular og noget id-else tilføjet):

<?PHP
    function saveImg( $url, $udfil )
    {
        if ( preg_match( "/^http:\/\/(.*?):?(\d+)?(\/.*)$/i", $url, $m ) )
        {
            list( $x, $host, $port, $path ) = $m;
            $port = ( $port != '' ? $port : 80 );
        }
        else
        {
            die( "Giv en URL!" );
        }
        if ( $fp = fsockopen( $host, $port, $en, $es, 10 ) )
        {
          $out = "GET $path HTTP/1.1\r\n";
          $out .= "Host: $host\r\n";
          $out .= "Connection: Close\r\n\r\n";

          fwrite( $fp, $out );
          $fil = '';
          while ( !feof( $fp ) )
          {
              $fil .= fread( $fp, 512 );
          }
          preg_match( "/^.*\r?\n\r?\n(.*)$/s", $fil, $match );
          fclose( $fp );
          $fp = fopen( $udfil, "wb" );
          fwrite( $fp, $match[1] );
          fclose( $fp );
          return true;
        }
        else
        {
            return false;
        }
    }

    if (isset($_REQUEST[saveme])){
        saveImg($_REQUEST[url],$_REQUEST[newname]);
    } else {
        echo '
            <form action="" method="post">
                URL <input type="text" name="url"><br />
                New name <input type="text" name="newname"><br />
                <input type="submit" value="save">
                <input type="hidden" name="saveme" value="1">
            </form>
        ';
    }
?>
Avatar billede foxwell Nybegynder
16. december 2004 - 02:34 #18
ps.: hvis man retter

if (isset($_REQUEST[saveme])){
  saveImg($_REQUEST[url],$_REQUEST[newname]);
} else ...

til

if (isset($_REQUEST[saveme])){
  saveImg($_REQUEST[url],$_REQUEST[newname]);
  echo '<img src="'.$_REQUEST[newname].'">';
} else ...

viser den også billedet den henter =)
Avatar billede foxwell Nybegynder
18. december 2004 - 15:07 #19
coderdk > lige et hurtigt spørgsmål... der er problemer med funktionen med enkelte billeder. det lader til at problemet er billeder som har en indbygget dpi som ikke er 72, eks. dette billede http://www.yzedf.com/pics/random/culibine.jpg. Når jeg køre f.eks. det billede igennem funktionen bliver filen gemt på serveren, men kan ikke vises, heller ikke når jeg downloader det og prøver at åbne det lokalt...

ved du hvad der kan skylde problemet? kan ikke rigtigt regne det ud...

//foxwell

ps.: kan evt. åbne som et nyt spørgsmål hvis du vil have lidt flere points =)
Avatar billede coderdk Praktikant
18. december 2004 - 15:57 #20
Hov! Min fejl ;)

Ændr:

          preg_match( "/^.*\r?\n\r?\n(.*)$/s", $fil, $match );

til:

          preg_match( "/^.*?\r?\n\r?\n(.*)$/s", $fil, $match );
Avatar billede foxwell Nybegynder
18. december 2004 - 16:09 #21
super, det virkede! =) aner ikke hvorfor, men det virkede!

tusind tak =))
Avatar billede coderdk Praktikant
18. december 2004 - 16:37 #22
Jeg manglede et ? som fjerner "grådigheden" af et regulært udtryk ;)
Avatar billede foxwell Nybegynder
09. januar 2005 - 14:27 #23
codedk > hej igen, scriptet fungerer super, har dog et enkelt problem... det lader til at der er problemer med billeder med mellemrum i, som bliver lavet om til %20. Er det noget der kan løses tror du?

mvh // foxwell
Avatar billede foxwell Nybegynder
09. januar 2005 - 14:55 #24
Jeg har forsøgt at bruge urldecode() men det lader ikke til at virke...
Avatar billede coderdk Praktikant
09. januar 2005 - 17:40 #25
Prøv med rawurldecode... Den laver %xx om til bogstaverne - Men det burde virke med urldecode - hvornår opstår problemet?
Avatar billede foxwell Nybegynder
09. januar 2005 - 18:52 #26
tror jeg var lidt forhastet... filerne bliver skabt, problemet ligger i at vise dem frem igen...

selvom jeg via ftp kan se at filen eksisterer (/mappen/en%20fil.jpg) kan jeg ikke via browseren få den at se når jeg skriver den fulde adresse på filen...

tror jeg skal sætte mig mere ind i hvordan servere behandler whitespace... men filerne hedder blah%20blah.jpg når jeg downloader dem, og ikke 'blah blah.jpg', så det må være noget med browseren der omdøber dem eller sådan noget...

billederne virker fint når de bliver downloadet...
Avatar billede coderdk Praktikant
09. januar 2005 - 18:53 #27
Når du gemmer dem så kør filnavnet igennem rawurldecode()...
Avatar billede foxwell Nybegynder
09. januar 2005 - 18:57 #28
ok, har løst problemet =) funktionen som du lavede skal fodres med URL og ønskede navn på den nye fil. Jeg laver en preg_replace og erstatter %20 med _ før jeg giver det nye navn til din funktion:

$newname = 'temp/' . strtolower(basename($_REQUEST[url]));
$newname = preg_replace("/%20/","_",$newname);
saveImg($_REQUEST[url],$newname);

ellers tak igen ^^
Avatar billede coderdk Praktikant
09. januar 2005 - 18:58 #29
I dette tilfælde er det nok hurtigere at bruge str_replace() - du bruger jo ikke nogen specielle regulære udtryk
Avatar billede foxwell Nybegynder
09. januar 2005 - 19:00 #30
funktionen er super fed og sparer mig for en masse tid - hvis det er OK med dig ville jeg gerne give lidt flere points, din hjælp med hele denne tråd er *langt* mere end 30pt værd...

er det ok at lave en "points til coderdk" tråd?
Avatar billede foxwell Nybegynder
09. januar 2005 - 19:02 #31
sandt =) retter til str_replace. igen tak, kender ikke så mange der arbejder med php, og det er den slags ting jeg synes er svære at lære selv, hvilken slags funktioner der er optimale at bruge i forskellige situationer osv...
Avatar billede coderdk Praktikant
09. januar 2005 - 19:02 #32
heheh det plejer da at være ok :) Du behøver ikke for min skyld, men det er da op til dig - du skal vist bare referere til denne tråd :)
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