七牛图片上传方法我们只要在框架中配置它的接口及上传的些小细节就可以实现了,下面一起来看一个关于配置thinkphp3.2支持七牛图片上传的方法,希望文章对各位有帮助。
作为php菜鸟,在公司捣鼓的一个基于thinkphp框架项目上要是用七牛(原来有用过c#版本的sdk)。现在在官方找到php的官方sdk,最后发现原来thinkphp已经支持驱动类型是qiniu的文件上传了。
现在将配置说明一下。
利用七牛云私有空间存储文件
注册七牛云,创建空间,将空间设为私有
需要记下的东西:
ak,sk,bucket
在config.php添加
//七牛上传文件设置
'picture_upload_driver'=>'qiniu',
//本地上传文件驱动配置
'upload_local_config'=>array(),
'upload_qiniu_config'=>array(
'accesskey'=>'l3n4q0xcqm0rssaamthryzyg-lnkmh',
'secrectkey'=>'7qpvaerasasan2tjalqqajf0h6jot0d1jf',
'bucket'=>'yaasasnbao',
'domain'=>'7xasssa.com2.z0.glb.qiniucdn.com',
'timeout'=>3600,
),
3、添加一个上传类model
upload($files);
if($info){ //文件上传成功,记录文件信息
return $info; //文件上传成功
} else {
$this->error = $upload->geterror();
return false;
}
}
/**
* 下载指定文件
* @param number $root 文件存储根目录
* @param integer $id 文件id
* @param string $args 回调函数参数
* @return boolean false-下载失败,否则输出下载文件
*/
public function download($root, $id, $callback = null, $args = null){
/* 获取下载文件信息 */
$file = $this->find($id);
if(!$file){
$this->error = '不存在该文件!';
return false;
}
/* 下载文件 */
switch ($file['location']) {
case 0: //下载本地文件
$file['rootpath'] = $root;
return $this->downlocalfile($file, $callback, $args);
case 1: //todo: 下载远程ftp文件
break;
default:
$this->error = '不支持的文件存储类型!';
return false;
}
}
/**
* 检测当前上传的文件是否已经存在
* @param array $file 文件上传数组
* @return boolean 文件信息, false - 不存在该文件
*/
public function isfile($file){
if(empty($file['md5'])){
throw new \exception('缺少参数:md5');
}
/* 查找文件 */
$map = array('md5' => $file['md5'],'sha1'=>$file['sha1'],);
return $this->field(true)->where($map)->find();
}
/**
* 下载本地文件
* @param array $file 文件信息数组
* @param callable $callback 下载回调函数,一般用于增加下载次数
* @param string $args 回调函数参数
* @return boolean 下载失败返回false
*/
private function downlocalfile($file, $callback = null, $args = null){
if(is_file($file['rootpath'].$file['savepath'].$file['savename'])){
/* 调用回调函数新增下载数 */
is_callable($callback) && call_user_func($callback, $args);
/* 执行下载 */ //todo: 大文件断点续传
header(content-description: file transfer);
header('content-type: ' . $file['type']);
header('content-length:' . $file['size']);
if (preg_match('/msie/', $_server['http_user_agent'])) { //for ie
header('content-disposition: attachment; filename=' . rawurlencode($file['name']) . '');
} else {
header('content-disposition: attachment; filename=' . $file['name'] . '');
}
readfile($file['rootpath'].$file['savepath'].$file['savename']);
exit;
} else {
$this->error = '文件已被删除!';
return false;
}
}
/**
* 清除数据库存在但本地不存在的数据
* @param $data
*/
public function removetrash($data){
//$this->where(array('id'=>$data['id'],))->delete();
}
}
4、修改调用上传类的代码
public function imgupload()
{
//$this->error(没有文件!);
//todo: 用户登录检测
/* 调用文件上传组件上传文件 */
$picture = d('picture');
$pic_driver = c('picture_upload_driver');
$info = $picture->upload(
$_files,
c('picture_upload'),
c('picture_upload_driver'),
c(upload_{$pic_driver}_config)
); //todo:上传到远程服务器
/* 记录图片信息 */
if($info){
/* 返回json数据 */
echo json_encode($info);
} else {
echo json_encode($info);
}
}
5、在客户端使用ajaxfileupload调用php方法
//上传图片
$(document).on('change','#upfile',function(){
$.ajaxfileupload({
url:'{:u(company/imgupload)}',
secureuri:false,
fileelementid:'upfile',
datatype: 'json',
type:'post',
data: { fileelementid: 'upfile'},
success: function (data) {
$('#showimg').attr('src',data.upfile.url);
$('#imageurl').val(data.upfile.url);
}
})
})
这里最好使用json的数据类型进行传输