前端通过form表单enctype="multipart/form-data"
直接上传文件,PHP可以在$_FILES
中接收.直接传到阿里OSS服务器
现在前端把图片转成base64(字符串)上传,没法用$_FILES
接收
解决方案
步骤1. 输出到本地
步骤2. 上传到OSS服务器,得到url
步骤3. 删除本地文件
/**
* 上传base64图片到OSS服务器
* @param string $imageBase64 从前端接收到的图片资源
* @param string $serviceDir 想要保存在OSS服务器上的目录
*
* @return string 图片在OSS服务器上的地址
*/
public function uploadImageBase64($imageBase64,$serviceDir){
$URL = '';
/** 得到文件后缀 */
//data:image/png;base64,iVBORw0KGgoA..
list($head,$image_data) = explode(',',$imageBase64); // head = data:image/png;base64 image_data = iVBORw0KGgoA..
list($type,) = explode(';',$head);// type = data:image/png
list(,$suffix) = explode('/',$type);// suffix = png
/** 步骤1. 输出到本地 */
$localDir = $_SERVER['DOCUMENT_ROOT'].'/Temp';
$localFilename = $this->makeUUID().'.'.$suffix;
file_put_contents($localDir.'/'.$localFilename,base64_decode($image_data));
/** 步骤2. 上传到OSS服务器,得到url */
try{
//$this->oss_client->uploadFile 是阿里提供的PHP-SDK中的方法
$response = $this->oss_client->uploadFile($this->bucket,$serviceDir.'/'.$localFilename,$localDir.'/'.$localFilename);
$URL = $response['info']['url'];
}catch (\Exception $e){
Log::write('文件上传错误:'.$e->getMessage());
$URL = '';
} finally {
/** 步骤3. 删除本地文件 */
unlink($localDir.'/'.$localFilename);
return $URL;
}
}
生成uuid方法
/**
* 生成uuid (8-4-4-4-12)
* @return string
*/
private function makeUUID(){
$chars = md5(uniqid(mt_rand(), true));
return substr ( $chars, 0, 8 ) . '-'
. substr ( $chars, 8, 4 ) . '-'
. substr ( $chars, 12, 4 ) . '-'
. substr ( $chars, 16, 4 ) . '-'
. substr ( $chars, 20, 12 );
}
调用时只需要
$serviceDir = 'Uploads/driver_report';//OSS服务器上保存的位置
$obj = new myClass();
$url = $obj->uploadImageBase64($post['img1'],$serviceDir)
网友评论