詳解php版阿里云OSS圖片上傳類

閱讀 48905  ·  發(fā)布日期 2020-08-24 11:44  ·  溫州優(yōu)光網(wǎng)絡科技有限公司|建站|APP小程序制作|做網(wǎng)站SEO推廣優(yōu)化
【摘要】 本文實例講述了php版阿里云OSS圖片上傳類。分享給大家供大家參考,具體如下:【相關學習推薦:php編程(視頻)】1.阿里云基本函數(shù)/** * 把本地變量的內(nèi)容到文件 * 簡單上傳,上傳指定變量的內(nèi)存值作為object的內(nèi)容 */ public function putObject($imgPath,$objec... 【溫州小程序開發(fā),溫州微信公眾號,平陽做網(wǎng)站,平陽網(wǎng)站建設公司,平陽小程序商城制作,昆陽萬全做網(wǎng)站,鰲江水頭小程序,蕭江騰蛟微信公眾號,山門順溪南雁海西南麂鳳臥麻步懷溪網(wǎng)絡網(wǎng)店服務,政采云網(wǎng)店管理服務】...

詳解php版阿里云OSS圖片上傳類

本文實例講述了php版阿里云OSS圖片上傳類。
分享給大家供大家參考,具體如下:
【相關學習推薦:
php編程(視頻)】1.阿里云基本函數(shù)/** * 把本地變量的內(nèi)容到文件 * 簡單上傳,上傳指定變量的內(nèi)存值作為object的內(nèi)容 */ public function putObject($imgPath,$object) {
$content = file_get_contents($imgPath);
// 把當前文件的內(nèi)容獲取到傳入文件中 $options = array();
try {
$this->ossClient->putObject($this->bucket, $object, $content, $options);
}
catch (OssException $e) {
return $e->getMessage();
}
return TRUE;
}
/** * 上傳指定的本地文件內(nèi)容 */ public function uploadFile($imgPath,$object) //$_FILES['
img'
]['
tmp_name'
] {
$filePath = $imgPath;
$options = array();
try {
$this->ossClient->uploadFile($this->bucket, $object, $filePath, $options);
}
catch (OssException $e) {
return $e->getMessage();
}
return TRUE;
}
// 刪除對象 public function deleteObject($object) {
try {
$this->ossClient->deleteObject($this->bucket, $object);
}
catch (OssException $e) {
return $e->getMessage();
}
return TRUE;
}
// 判斷對象是否存在 public function doesObjectExist($object) {
try {
$result = $this->ossClient->doesObjectExist($this->bucket, $object);
}
catch (OssException $e) {
return $e->getMessage();
}
return $result;
}
// 批量刪除對象 public function deleteObjects($objects) {
try {
$this->ossClient->deleteObjects($this->bucket, $objects);
}
catch (OssException $e) {
return $e->getMessage();
}
return TRUE;
}
/** * 獲取object的內(nèi)容 * * @param OssClient $ossClient OssClient實例 * @param string $bucket 存儲空間名稱 * @return null */ public function getObject($object) {
$options = array();
try {
$content = $this->ossClient->getObject($this->bucket, $object, $options);
}
catch (OssException $e) {
return $e->getMessage();
}
// file_get_contents return $content;
}
2.基本配置與輔助函數(shù)public $ossClient,$bucket;
private $configinfo = array( '
maxSize'
=> -1, // 上傳文件的最大值 '
supportMulti'
=> true, // 是否支持多文件上傳 '
allowExts'
=> array(), // 允許上傳的文件后綴 留空不作后綴檢查 '
allowTypes'
=> array(), // 允許上傳的文件類型 留空不做檢查 '
thumb'
=> false, // 使用對上傳圖片進行縮略圖處理 '
imageClassPath'
=> '
ORG.Util.Image'
, // 圖庫類包路徑 '
thumbMaxWidth'
=> '
'
,// 縮略圖最大寬度 '
thumbMaxHeight'
=> '
'
,// 縮略圖最大高度 '
thumbPrefix'
=> '
thumb_'
,// 縮略圖前綴 '
thumbSuffix'
=> '
'
, '
thumbPath'
=> '
'
,// 縮略圖保存路徑 '
thumbFile'
=> '
'
,// 縮略圖文件名 '
thumbExt'
=> '
'
,// 縮略圖擴展名 '
thumbRemoveOrigin'
=> false,// 是否移除原圖 '
zipImages'
=> false,// 壓縮圖片文件上傳 '
autoSub'
=> false,// 啟用子目錄保存文件 '
subType'
=> '
hash'
,// 子目錄創(chuàng)建方式 可以使用hash date custom '
subDir'
=> '
'
, // 子目錄名稱 subType為custom方式后有效 '
dateFormat'
=> '
Ymd'
, '
hashLevel'
=> 1, // hash的目錄層次 '
savePath'
=> '
'
,// 上傳文件保存路徑 '
autoCheck'
=> true, // 是否自動檢查附件 '
uploadReplace'
=> false,// 存在同名是否覆蓋 '
saveRule'
=> '
uniqid'
,// 上傳文件命名規(guī)則 '
hashType'
=> '
md5_file'
,// 上傳文件Hash規(guī)則函數(shù)名 );
// 錯誤信息 private $error = '
'
;
// 上傳成功的文件信息 private $uploadFileInfo ;
public function __get($name){
if(isset($this->configinfo[$name])) {
return $this->configinfo[$name];
}
return null;
}
public function __set($name,$value){
if(isset($this->configinfo[$name])) {
$this->configinfo[$name] = $value;
}
}
public function __isset($name){
return isset($this->configinfo[$name]);
}
/** * 架構函數(shù) * @access public * @param array $config 上傳參數(shù) */ public function __construct($config=array()) {
if(is_array($config)) {
$this->config = array_merge($this->config,$config);
}
$this->bucket = C('
OSS_TEST_BUCKET'
);
$this->ossClient = new OssClient(C('
OSS_ACCESS_ID'
), C('
OSS_ACCESS_KEY'
), C('
OSS_ENDPOINT'
), false);
}
3.主函數(shù)/** * 上傳所有文件 * @access public * @param string $savePath 上傳文件保存路徑 * @return string */ public function upload($savePath ='
'
) {
//如果不指定保存文件名,則由系統(tǒng)默認 if(empty($savePath)) {
$savePath = $this->savePath;
}
$fileInfo = array();
$isUpload = false;
// 獲取上傳的文件信息 // 對$_FILES數(shù)組信息處理 $files = $this->dealFiles($_FILES);
foreach($files as $key => $file) {
//過濾無效的上傳 if(!empty($file['
name'
])) {
//登記上傳文件的擴展信息 if(!isset($file['
key'
])) $file['
key'
] = $key;
$file['
extension'
] = $this->getExt($file['
name'
]);
$file['
savepath'
] = $savePath;
$file['
savename'
] = $this->getSaveName($file);
// 自動檢查附件 if($this->autoCheck) {
if(!$this->check($file)) return false;
}
//保存上傳文件 if(!$this->save($file)) return false;
if(function_exists($this->hashType)) {
$fun = $this->hashType;
$file['
hash'
] = $fun($this->autoCharset($file['
savepath'
].$file['
savename'
],'
utf-8'
,'
gbk'
));
}
//上傳成功后保存文件信息,供其他地方調用 unset($file['
tmp_name'
],$file['
error'
]);
$fileInfo[] = $file;
$isUpload = true;
}
}
if($isUpload) {
$this->uploadFileInfo = $fileInfo;
return true;
}
else {
$this->error = '
沒有選擇上傳文件'
;
return false;
}
}
4.核心處理函數(shù)/** * 上傳一個文件 * @access public * @param mixed $name 數(shù)據(jù) * @param string $value 數(shù)據(jù)表名 * @return string */ private function save($file) {
$filename = $file['
savepath'
].$file['
savename'
];
if(!$this->uploadReplace && $this->doesObjectExist($filename)) {
// 不覆蓋同名文件 $this->error = '
文件已經(jīng)存在!'
.$filename;
return false;
}
// 如果是圖像文件 檢測文件格式 if( in_array(strtolower($file['
extension'
]),array('
gif'
,'
jpg'
,'
jpeg'
,'
bmp'
,'
png'
,'
swf'
))) {
$info = getimagesize($file['
tmp_name'
]);
if(false === $info || ('
gif'
== strtolower($file['
extension'
]) && empty($info['
bits'
]))){
$this->error = '
非法圖像文件'
;
return false;
}
}
if(!$this->putObject($file['
tmp_name'
], $this->autoCharset($filename,'
utf-8'
,'
gbk'
))) {
$this->error = '
文件上傳保存錯誤!'
;
return false;
}
if($this->thumb && in_array(strtolower($file['
extension'
]),array('
gif'
,'
jpg'
,'
jpeg'
,'
bmp'
,'
png'
))) {
$image = getimagesize(C('
OSS_IMG_URL'
).'
/'
.$filename);
if(false !== $image) {
//是圖像文件生成縮略圖 $thumbWidth = explode('
,'
,$this->thumbMaxWidth);
$thumbHeight = explode('
,'
,$this->thumbMaxHeight);
$thumbPrefix = explode('
,'
,$this->thumbPrefix);
$thumbSuffix = explode('
,'
,$this->thumbSuffix);
$thumbFile = explode('
,'
,$this->thumbFile);
$thumbPath = $this->thumbPath?$this->thumbPath:dirname($filename).'
/'
;
$thumbExt = $this->thumbExt ? $this->thumbExt : $file['
extension'
];
//自定義縮略圖擴展名 // 生成圖像縮略圖 import($this->imageClassPath);
for($i=0,$len=count($thumbWidth);
$i $i++) {
if(!empty($thumbFile[$i])) {
$thumbname = $thumbFile[$i];
}
else{
$prefix = isset($thumbPrefix[$i])?$thumbPrefix[$i]:$thumbPrefix[0];
$suffix = isset($thumbSuffix[$i])?$thumbSuffix[$i]:$thumbSuffix[0];
$thumbname = $prefix.basename($filename,'
.'
.$file['
extension'
]).$suffix;
}
$this->thumb(C('
OSS_IMG_URL'
).'
/'
.$filename,$thumbPath.$thumbname.'
.'
.$thumbExt,'
'
,$thumbWidth[$i],$thumbHeight[$i],true);
}
if($this->thumbRemoveOrigin) {
// 生成縮略圖之后刪除原圖 $this->deleteObject($filename);
}
}
}
if($this->zipImags) {
// TODO 對圖片壓縮包在線解壓 }
return true;
}
/** * 生成縮略圖 * @static * @access public * @param string $image 原圖 * @param string $type 圖像格式 * @param string $thumbname 縮略圖文件名 * @param string $maxWidth 寬度 * @param string $maxHeight 高度 * @param string $position 縮略圖保存目錄 * @param boolean $interlace 啟用隔行掃描 * @return void */ public function thumb($image, $thumbname, $type='
'
, $maxWidth=200, $maxHeight=50, $interlace=true) {
// 獲取原圖信息 $info = Image::getImageInfo($image);
if ($info !== false) {
$srcWidth = $info['
width'
];
$srcHeight = $info['
height'
];
$type = empty($type) ? $info['
type'
] : $type;
$type = strtolower($type);
$interlace = $interlace ? 1 : 0;
unset($info);
$scale = min($maxWidth / $srcWidth, $maxHeight / $srcHeight);
// 計算縮放比例 if ($scale >= 1) {
// 超過原圖大小不再縮略 $width = $srcWidth;
$height = $srcHeight;
}
else {
// 縮略圖尺寸 $width = (int) ($srcWidth * $scale);
$height = (int) ($srcHeight * $scale);
}
// 載入原圖 $createFun = '
ImageCreateFrom'
. ($type == '
jpg'
? '
jpeg'
: $type);
if(!function_exists($createFun)) {
return false;
}
$srcImg = $createFun($image);
//創(chuàng)建縮略圖 if ($type != '
gif'
&& function_exists('
imagecreatetruecolor'
)) $thumbImg = imagecreatetruecolor($width, $height);
else $thumbImg = imagecreate($width, $height);
//png和gif的透明處理 by luofei614 if('
png'
==$type){
imagealphablending($thumbImg, false);
//取消默認的混色模式(為解決陰影為綠色的問題) imagesavealpha($thumbImg,true);
//設定保存完整的 alpha 通道信息(為解決陰影為綠色的問題) }
elseif('
gif'
==$type){
$trnprt_indx = imagecolortransparent($srcImg);
if ($trnprt_indx >= 0) {
//its transparent $trnprt_color = imagecolorsforindex($srcImg , $trnprt_indx);
$trnprt_indx = imagecolorallocate($thumbImg, $trnprt_color['
red'
], $trnprt_color['
green'
], $trnprt_color['
blue'
]);
imagefill($thumbImg, 0, 0, $trnprt_indx);
imagecolortransparent($thumbImg, $trnprt_indx);
}
}
// 復制圖片 if (function_exists("ImageCopyResampled")) imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);
else imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);
// 對jpeg圖形設置隔行掃描 if ('
jpg'
== $type || '
jpeg'
== $type) imageinterlace($thumbImg, $interlace);
imagePNG($thumbImg,'
Uploads/file.png'
);
// 中轉站 // 生成圖片 $this->putObject('
Uploads/file.png'
,$thumbname);
imagedestroy($thumbImg);
imagedestroy($srcImg);
return $thumbname;
}
return false;
}
5.輔助函數(shù)/** * 轉換上傳文件數(shù)組變量為正確的方式 * @access private * @param array $files 上傳的文件變量 * @return array */ private function dealFiles($files) {
$fileArray = array();
$n = 0;
foreach ($files as $key=>$file){
if(is_array($file['
name'
])) {
$keys = array_keys($file);
$count = count($file['
name'
]);
for ($i=0;
$i $i++) {
$fileArray[$n]['
key'
] = $key;
foreach ($keys as $_key){
$fileArray[$n][$_key] = $file[$_key][$i];
}
$n++;
}
}
else{
$fileArray[$key] = $file;
}
}
return $fileArray;
}
/** * 檢查上傳的文件 * @access private * @param array $file 文件信息 * @return boolean */ private function check($file) {
if($file['
error'
]!== 0) {
//文件上傳失敗 //捕獲錯誤代碼 $this->error($file['
error'
]);
return false;
}
//文件上傳成功,進行自定義規(guī)則檢查 //檢查文件大小 if(!$this->checkSize($file['
size'
])) {
$this->error = '
上傳文件大小不符!'
;
return false;
}
//檢查文件Mime類型 if(!$this->checkType($file['
type'
])) {
$this->error = '
上傳文件MIME類型不允許!'
;
return false;
}
//檢查文件類型 if(!$this->checkExt($file['
extension'
])) {
$this->error ='
上傳文件類型不允許'
;
return false;
}
//檢查是否合法上傳 if(!$this->checkUpload($file['
tmp_name'
])) {
$this->error = '
非法上傳文件!'
;
return false;
}
return true;
}
// 自動轉換字符集 支持數(shù)組轉換 private function autoCharset($fContents, $from='
gbk'
, $to='
utf-8'
) {
$from = strtoupper($from) == '
UTF8'
? '
utf-8'
: $from;
$to = strtoupper($to) == '
UTF8'
? '
utf-8'
: $to;
if (strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents))) {
//如果編碼相同或者非字符串標量則不轉換 return $fContents;
}
if (function_exists('
mb_convert_encoding'
)) {
return mb_convert_encoding($fContents, $to, $from);
}
elseif (function_exists('
iconv'
)) {
return iconv($from, $to, $fContents);
}
else {
return $fContents;
}
}
/** * 檢查上傳的文件類型是否合法 * @access private * @param string $type 數(shù)據(jù) * @return boolean */ private function checkType($type) {
if(!empty($this->allowTypes)) return in_array(strtolower($type),$this->allowTypes);
return true;
}
/** * 檢查上傳的文件后綴是否合法 * @access private * @param string $ext 后綴名 * @return boolean */ private function checkExt($ext) {
if(!empty($this->allowExts)) return in_array(strtolower($ext),$this->allowExts,true);
return true;
}
/** * 檢查文件大小是否合法 * @access private * @param integer $size 數(shù)據(jù) * @return boolean */ private function checkSize($size) {
return !($size > $this->maxSize) || (-1 == $this->maxSize);
}
/** * 檢查文件是否非法提交 * @access private * @param string $filename 文件名 * @return boolean */ private function checkUpload($filename) {
return is_uploaded_file($filename);
}
/** * 取得上傳文件的后綴 * @access private * @param string $filename 文件名 * @return boolean */ private function getExt($filename) {
$pathinfo = pathinfo($filename);
return $pathinfo['
extension'
];
}
/** * 取得上傳文件的信息 * @access public * @return array */ public function getUploadFileInfo() {
return $this->uploadFileInfo;
}
/** * 取得最后一次錯誤信息 * @access public * @return string */ public function getErrorMsg() {
return $this->error;
}
總結:
與普通上傳的區(qū)別在于,它是全部通過阿里云的oss接口來處理文件保存的。
普通上傳是把本地文件移動到服務器上,而它則是把文件移動到阿里云服務器上。
縮略圖思路:
a.上傳圖片至服務器b.獲取圖片進行處理c.上傳處理好的圖片至服務器d.根據(jù)配置,刪除或者不刪除服務器的原圖(OSS)imagePNG($thumbImg,'
Uploads/file.png'
);
// 中轉站 // 生成圖片 $this->putObject('
Uploads/file.png'
,$thumbname);
unlink('
Uploads/file.png'
);
imagedestroy($thumbImg);
相關推薦:
編程視頻課程以上就是詳解php版阿里云OSS圖片上傳類的詳細內(nèi)容,更多請關注php中文網(wǎng)其它相關文章!
微信
分享相關標簽:
php 阿里云 OSS 圖片上傳類本文轉載于:
jb51,如有侵犯,請聯(lián)系[email protected]刪除
上一篇:
示例php+mysql查詢實現(xiàn)無限下級分類樹輸出
下一篇:
阿里云PHP SMS短信服務驗證碼發(fā)送方法詳解相關文章相關視頻Html直接表單直傳阿里云存儲OSS示例_html...PHP文件上傳之阿里云OSS的使用vue阿里云上傳組件詳解開通OSS服務如何導出ECS自定義鏡像詳解php版阿里云OSS圖片上傳類通過PHP程序添加數(shù)據(jù)通過PHP程序刪除數(shù)據(jù)php程序中實現(xiàn)事務PHP重載-屬性攔截器 [溫州做網(wǎng)站PHP教程]