PHP从网络下载图片并上传到阿里云OSS服务器的方法Demo
- 13549
- PHP
- 0
- super_dodo
- 2017/04/07
阿里云的oss存储越来越多的被广大开发者使用,且阿里云的存储系统可以帮开发者节省开发时间,运维时间,以及不必要的风险(老的文件系统单目录不建议超过2000个文件,文件数目过多文件索引寻找就很耗时耗资源)等。至于阿里云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.知识,千金易散尽,善学是财富,唯有知识能够创造一切。
相关阅读
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
热门文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
最新文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例

