PHP从网络下载图片并上传到阿里云OSS服务器的方法

阿里云的oss存储越来越多的被广大开发者使用,且阿里云的存储系统可以帮开发者节省开发时间,运维时间,以及不必要的风险(老的文件系统单目录不建议超过2000个文件,文件数目过多文件索引寻找就很耗时耗资源)等。

使用阿里云oss的时候建议先去看看相关的文档,且把sdk下载下来,引入到你的项目之中。

Oss的sdk下载clone的地址:https://github.com/aliyun/aliyun-oss-php-sdk/tree/master/src/OSS

Oss的api地址:https://help.aliyun.com/document_detail/31947.html

[php]

//定义一些常量
CONST OSS_ACCESS_KEY_ID = ‘n**************uc’; //AccessKeyID
CONST OSS_ACCESS_KEY_SECRET = ‘Gb************************Tu’; //AccessKeySecret
CONST OSS_BUCKET_NAME = ‘dodo2017’; //此名字不可以重复
CONST OSS_ENDPOINT = ‘http://oss-cn-hangzhou.aliyuncs.com’; //阿里云杭州
CONST OSS_URL_PREFIX = ‘http://’.self::OSS_BUCKET_NAME.’.oss-cn-hangzhou.aliyuncs.com’;

//通过一个URL地址进行下载图片到本地目录,并上传到OSS,返回OSS的url地址
public static function uploadImageFromUrl(){
//图片地址–网络
$img_url = ‘http://www.dodobook.net/wp-content/uploads/2016/11/win8_theme_1.png’;

//把图片下载到本地
$localImgDir = self::imgDownLocal($img_url);

//把本地图片上传到阿里云Oss
$oss_img_url = self::imgUploadOss($localImgDir);

echo $oss_img_url; //得到oss的图片地址
return $oss_img_url ?? false;
}

//把图片下载到本地的目录,返回本地目录
public static function imgDownLocal($img_url){
$path = ”; //默认路径
$cacheDir = Yii::$app->basePath.’/upload/’; //图片本地目录地址
if(!is_dir($cacheDir)){ //如果目录不存在
mkdir($cacheDir,0777,true); //创建目录
// exec("chmod -R 777 {$cacheDir} "); //更改相关的权限
}
//使用linux的wget去下载文件(对于大文件有好处)
$cmd = "wget –no-check-certificate -P {$cacheDir} {$img_url}";
exec($cmd, $output, $returnValue);
if ($returnValue == 0) {
$path = $cacheDir.’/’.basename($img_url);
}
return $path; //返回本地的地址
}

//通过本地图片路径上传到oss服务器–返回oss的URL地址
public static function imgUploadOss($localImgDir){
//实例化oss–先在头部引入OssClient
$ossClient = new OssClient(self::OSS_ACCESS_KEY_ID,self::OSS_ACCESS_KEY_SECRET,self::OSS_ENDPOINT);
//上传图片的示例–本地图片
$dir_prefix = Yii::$app->basePath.’/upload/’; //图片本地目录地址
$object = str_replace($dir_prefix,”,$localImgDir);

$ossClient->uploadFile(self::OSS_BUCKET_NAME,$object,$localImgDir); //返回值为null
$oss_img_url = self::OSS_URL_PREFIX.’/’.$object;
@unlink($localImgDir); //删除图片
return $oss_img_url; //返回oss的图片真实地址
}

[/php]

也可以直接file_get_content()等.但是对于图片都没什么影响,对于大文件的话还是建议使用wget,因为fread fwrite这类的方法是把文件读取到内存中,对于大文件会把内存撑爆发生事故。使用wget则是下载一部分写磁盘一部分。这样安全很多。

[php]

function GrabImage($url) {
if (!$url) return false; //如果$url地址为空,直接退出

$imgArr = explode(‘/’,$url);
$filename = $imgArr[count($imgArr)-1];

ob_start();//打开输出
readfile($url);//输出图片文件
$img = ob_get_contents();//得到浏览器输出
ob_end_clean();//清除输出并关闭
$size = strlen($img);//得到图片大小
$fp2 = @fopen($filename, "a");
fwrite($fp2, $img);//向当前目录写入图片文件,并重新命名
fclose($fp2);
return $filename;//返回新的文件名
}

[/php]

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注