简体   繁体   中英

Unable to copy image from URL in PHP with upload class

I'm trying to make a upload class with PHP. so this is my first PHP class:

//Create Class
class Upload{
  //Remote Image Upload
  function Remote($Image){
    $Content = file_get_contents($Image);
    if(copy($Content, '/test/sdfsdfd.jpg')){
      return "UPLOADED";
    }else{
      return "ERROR";
    }
  }
}

and usage:

$Upload = new Upload();
echo $Upload->Remote('https://www.gstatic.com/webp/gallery/4.sm.jpg');

problem is, this class is not working. where is the problem? I'm new with PHP classes and trying to learn it.

thank you.

copy expects filesystem paths, eg

copy('/path/to/source', '/path/to/destination');

You're passing in the literal image you fetched, so it's going to be

copy('massive pile of binary garbage that will be treated as a filename', '/path/to/destination');

You want

file_put_contents('/test/sdfsdfg.jpg', $Content);

instead.

PHP's copy() function is used for copying files that you have permission to copy.

Since you're getting the contents of the file first, you could use fwrite() .

<?php

//Remote Image Upload
function Remote($Image){
    $Content = file_get_contents($Image);
    // Create the file
    if (!$fp = fopen('img.png', 'w')) {
        echo "Failed to create image file.";
    }

    // Add the contents
    if (fwrite($fp, $Content) === false) {
        echo "Failed to write image file contents.";
    }

    fclose($fp);
}

Since you want to download a image, you could also use the imagejpeg -method of php to ensure you do not end up with any corrupted file format afterwards ( http://de2.php.net/manual/en/function.imagejpeg.php ):

  • download the target as "String"
  • create a image resource out of it.
  • save it as jpeg, using the proper method:

inside your method:

$content = file_get_contents($Image);
$img = imagecreatefromstring($content);
return imagejpeg($img, "Path/to/targetFile");

In order to have file_get_contents working correctly you need to ensure that allow_url_fopen is set to 1 in your php ini: http://php.net/manual/en/filesystem.configuration.php

Most managed hosters disable this by default. Either contact the support therefore or if they will not enable allow_url_fopen , you need to use another attempt, for example using cURL for file download. http://php.net/manual/en/book.curl.php

U can use the following snippet to check whether its enabled or not:

if ( ini_get('allow_url_fopen') ) {
   echo "Enabled";
} else{
   echo "Disabled";
}

What you describe is more download (to the server) then upload. stream_copy_to_stream .

class Remote
{
    public static function download($in, $out)
    {
        $src = fopen($in, "r");
        if (!$src) {
            return 0;
        }
        $dest = fopen($out, "w");
        if (!$dest) {
            return 0;
        }

        $bytes = stream_copy_to_stream($src, $dest);

        fclose($src); fclose($dest);

        return $bytes;
    }
}

$remote = 'https://www.gstatic.com/webp/gallery/4.sm.jpg';
$local = __DIR__ . '/test/sdfsdfd.jpg';

echo (Remote::download($remote, $local) > 0 ? "OK" : "ERROR");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM