我正在尝试使用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课程的新手,并试图学习它。
谢谢。
答案 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):
在你的方法中:
$content = file_get_contents($Image);
$img = imagecreatefromstring($content);
return imagejpeg($img, "Path/to/targetFile");
为了让file_get_contents
正常工作,您需要确保在您的php ini中将allow_url_fopen
设置为1
:http://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");