【www.bbyears.com--thinkphp】
作为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
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: huajie
// +----------------------------------------------------------------------
namespace Admin\Model;
use Think\Model;
use Think\Upload;
/**
* 图片模型
* 负责图片的上传
*/
class PictureModel extends Model{
/**
* 自动完成
* @var array
*/
protected $_auto = array(
array("status", 1, self::MODEL_INSERT),
array("create_time", NOW_TIME, self::MODEL_INSERT),
);
/**
* 文件上传
* @param array $files 要上传的文件列表(通常是$_FILES数组)
* @param array $setting 文件上传配置
* @param string $driver 上传驱动名称
* @param array $config 上传驱动配置
* @return array 文件上传成功后的信息
*/
public function upload($files, $setting, $driver = "Local", $config = null){
/* 上传文件 */
$Upload = new Upload($setting, $driver, $config);
$info = $Upload->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的数据类型进行传输