需求:
与安卓交互需要用到图片上传,由于PHP接收不到文件形式,所以转成base64编码上传;
实现:
首先在控制器中引入加上
header('Content-type:text/html;charset=utf-8');
vendor('Qiniu.autoload');
use Qiniu\Auth as Auth;
use Qiniu\Storage\UploadManager;
让安卓传两个参数,第一个参数“base64编码(看好编码前面必须是data:image/jpg;base64,开头的,不然上传失败)”,第二个参数:‘文件名不要后缀名’(这里根据自己的需要也可以不传文件名称,自己生成);
代码实现:
public function files()
{
//得到文件对象
$base64_image_content = $_POST['file'];
$addName = $_POST['filename'];
$str = '';
$str = $this->upload($base64_image_content,$addName);
if(!empty($str)){
return json(
array(
'code'=>200,
'msg'=>'上传成功',
'data'=>$str
)
);
} else {
return json(
array(
'code'=>400,
'msg'=>'上传失败',
)
);
}
}
执行上传代码
public function upload($base64_image_content,$addName)
{
//匹配出图片的格式
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
$type = $result[2];
$new_file = "./uploads/default/".date('Ymd',time());
if(!file_exists($new_file))
{
//检查是否有该文件夹,如果没有就创建,并给予最高权限
mkdir($new_file, 0777);
}
$new_file = $new_file.'/'.md5($addName).".{$type}";
//print_r($new_file);die;
//解码图片
if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){
//调用七牛云上传
$res = $this->qinius($new_file,md5($addName));
if($res){
return $new_file;
} else {
// 上传失败获取错误信息
$this->error('云上传失败,请重新上传');
}
}else{
unlink($new_file);
echo '保存失败';
}
}
}
执行七牛云上传
public function qinius($filePath,$filename)
{
//获取当前控制器名称
//$controllerName = 'index';
// 上传到七牛后保存的文件名
$key = $filename;
// 需要填写你的 Access Key 和 Secret Key
$accessKey = '你自己的ak';
$secretKey = '你自己的sk';
// 构建鉴权对象
$auth = new Auth($accessKey, $secretKey);
//var_dump($auth);die;
// 要上传的空间
$bucket = '空间名;
$domain = '七牛云空间域名';
$token = $auth->uploadToken($bucket);
// 初始化 UploadManager 对象并进行文件的上传
$uploadMgr = new UploadManager();
// 调用 UploadManager 的 putFile 方法进行文件的上传
list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
if ($err !== null) {
echo ["err"=>1,"msg"=>$err,"data"=>""];
} else {
//返回图片的完整文件名称
return $ret;
}
}