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

  •   
  • 12071
  • PHP
  • 0
  • super_dodo
  • 2017/04/07

阿里云的oss存储越来越多的被广大开发者使用,且阿里云的存储系统可以帮开发者节省开发时间,运维时间,以及不必要的风险(老的文件系统单目录不建议超过2000个文件,文件数目过多文件索引寻找就很耗时耗资源)等。至于阿里云OSS存储的好处罄竹难书,存在即合理,现在这么流行,一定有其过人之处。

aliyun_oss

使用阿里云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


//定义一些常量
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的图片真实地址
}


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

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;//返回新的文件名
}

温馨提示,在一家有点规模的开发团队里面,得到准确的相关账号key以及后台的权限是很重要的,不然只能摸石头过河,遇到这种情况最快速高效的方法就是厚着脸皮去问,不要怕出错或出丑,三人行必有我师。dodo就是比较笨拙因为一个key弄错了,走了一些弯路也荒废了好多时间。所以迈开腿张开口,像销售一样去战斗吧。

无论我们走到哪里,有 5 样东西不能丢弃:1.追求,没有目标,你就失去了精神的信仰;2.尊严,它能支撑你的脊梁,让你高傲的或者;3.自信,千钧压顶何须叹,披荆斩棘向看;4.坚韧,成败皆在毫厘之间,只要你选择的,再苦再难都要挺住;5.知识,千金易散尽,善学是财富,唯有知识能够创造一切。