作为php菜鸟,在公司捣鼓的一个基于thinkphp框架项目上要是用七牛(原来有用过C#版本的sdk)。现在在官方找到php的官方sdk,最后发现原来Thinkphp已经支持驱动类型是qiniu的文件上传了。
现在将配置说明一下。
利用七牛云私有空间存储文件
1
注册七牛云,创建空间,将空间设为私有
需要记下的东西:
AK,SK,bucket
2
在config.php添加
1
2
3
4
5
6
7
8
9
10
11
|
//七牛上传文件设置
'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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: huajie <banhuajie@163.com>
// +----------------------------------------------------------------------
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、修改调用上传类的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//上传图片
$(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);
}
})
})
|