无法使用上传类从PHP复制URL中的图像

时间:2014-10-07 15:54:50

标签: php class oop upload

我正在尝试使用PHP制作上传课程。所以这是我的第一个PHP类:

//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";
    }
  }
}

和用法:

$Upload = new Upload();
echo $Upload->Remote('https://www.gstatic.com/webp/gallery/4.sm.jpg');
问题是,这个班不起作用。问题出在哪儿?我是PHP课程的新手,并试图学习它。

谢谢。

4 个答案:

答案 0 :(得分:1)

copy需要文件系统路径,例如

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

你传递了你提取的文字图像,所以它将成为

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

你想要

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

代替。

答案 1 :(得分:1)

PHP的copy()函数用于复制您有权复制的文件。

由于您首先获取文件的内容,因此可以使用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);
}

答案 2 :(得分:1)

由于您要下载图像,您还可以使用php的imagejpeg - 方法,以确保您之后不会以任何损坏的文件格式结束(http://de2.php.net/manual/en/function.imagejpeg.php):

  • 将目标下载为&#34;字符串&#34;
  • 从中创建图像资源。
  • 使用正确的方法将其保存为jpeg:

在你的方法中:

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

为了让file_get_contents正常工作,您需要确保在您的php ini中将allow_url_fopen设置为1http://php.net/manual/en/filesystem.configuration.php

默认情况下,大多数托管主机都会禁用此功能。因此,请联系支持人员,或者如果他们不启用allow_url_fopen,则需要使用其他尝试,例如使用cURL进行文件下载。 http://php.net/manual/en/book.curl.php

您可以使用以下代码段来检查其是否已启用:

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

答案 3 :(得分:1)

您所描述的是更多下载(到服务器)然后上传。 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");