主要思路,在controller里边通过获得要删除的文件fileid,把fileid传递给model的deletefile方法进行处理,并返回处理结果。
在deletefile方法里边,先根据id找到对应的文件信息,然后删除数据里边的记录和阿里云oss里边的文件和本地的文件。
主要步骤如下:
1 首先是构建一个view视图,或者写一个ajax发送请求,此处代码略(让前端去写吧)。
2 在控制器里边接收参数,并转交给model。控制器UploadController.php里边的代码参考如下:
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
|
/**
* 根据fileid删除文件
* @return mixed 删除是否成功
*/
public function actionDeletefile()
{
$res [ 'error' ] = 1; // 准备返回数据
Yii:: $app ->response->format = Response::FORMAT_JSON; // 设置返回格式
if (Yii:: $app ->request->isPost){ // 如果是post请求
$postdata = Yii:: $app ->request->post( 'fileid' ,0); // 从post里边获取文件id
if ( $postdata ==0){ // 如果文件id为0
$res [ 'errmsg' ] = '删除失败,请重试' ; // 准备返回数据
return $res ; // 返回结果
}
$model = new UploadForm(); // 实例化model
$delres = $model ->deletefile( $postdata ); // 根据id调用deletefile方法
if ( $delres [ 'error' ]==0){ // 如果删除成功
$res [ 'error' ] = 0; // 准备返回信息
} else {
$res [ 'errmsg' ] = $delres [ 'errmsg' ]; // 如果删除失败,准备返回信息
}
} else {
$res [ 'errmsg' ] = '非法请求' ; // 主要考虑post请求,get请求请自行修改代码
}
return $res ; // 返回删除结果
}
|
3 当controller把文件id转移给UploadForm.php以后,在deletefile方法里边进行删除。
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
|
/**
* 删除阿里云oss里存储的文件和数据库里边保存到文件上传信息
* @param $fileid 文件表里边的主键id
* @return boolean 删除是否成功
*/
public function deletefile( $fileid )
{
$res [ 'error' ] = 1; // 1表示默认有错误。
$fileinfo = Yii:: $app ->db->createCommand( 'select ossfile,filePath,userid from file where id=:id' )->bindParam( ':id' , $fileid )->queryOne();
// 根据主键从数据库里边查询文件的信息,至少要一个服务器文件的完整路径(用来删除服务器文件)和一个ossfile的名称(删除阿里云oss里边的文件)
if ( count ( $fileinfo ) > 0) { // 如果找到了文件的记录
// 这里边的验证可以更丰富一些,比如验证用户是否有权限删除该文件,文件是否属于该用户等等
$ossfile = $fileinfo [ 'ossfile' ]; // 获取ossfile
$realfile = $fileinfo [ 'filePath' ]; // 获取服务器上的文件
$owner = $fileinfo [ 'userid' ]; // 获取上传图片用户的id
$operator = Yii:: $app ->user->id; // 获取删除图片的用户
if ( $owner != $operator ) { // 如果删除图片的用户不是上传的用户,报错并返回
$res [ 'errmsg' ] = '您删除的图片不存在' ;
return $res ;
}
$trans = Yii:: $app ->db->beginTransaction(); // 开启事务
try {
$delstatus = Yii:: $app ->db->createCommand()-> delete ( 'file' , 'id = ' . $fileid )->execute();
//删除数据库里边的记录
if ( $delstatus ) { // 如果删除成功
if (Yii:: $app ->Aliyunoss-> delete ( $ossfile )) { //删除阿里云oss上的文件
@unlink( $realfile ); // 删除服务器上的文件
$res [ 'error' ] = 0; // 准备返回信息
$trans ->commit(); // 提交事务
}
}
$trans ->rollBack(); // 删除失败,事务回滚
} catch (Exception $e ) { // 发生异常
$res [ 'errmsg' ] = '删除失败' ; // 准备返回信息
$trans ->rollBack(); // 事务回滚
}
} else {
$res [ 'errmsg' ] = '图片不存在,请重试' ; // 图片不存在
}
return $res ; // 返回删除结果
}
|
阿里云oss文件的上传和删除已经写完了。当初自己也是遇到了很多问题,发现从网上找,竟然找不到理想的参考代码。所以才写了这几篇文章。希望对大家的开发有所帮助。毕竟水平有限,如果遇到考虑不周或者代码有误的地方,请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.yiichina.com/code/1080