weinirumo 2016-11-25 17:16:24 6362次浏览 3条评论 14 0 0

主要思路,在controller里边通过获得要删除的文件fileid,把fileid传递给model的deletefile方法进行处理,并返回处理结果。
在deletefile方法里边,先根据id找到对应的文件信息,然后删除数据里边的记录和阿里云oss里边的文件和本地的文件。

主要步骤如下:

1 首先是构建一个view视图,或者写一个ajax发送请求,此处代码略(让前端去写吧)。

2 在控制器里边接收参数,并转交给model。控制器UploadController.php里边的代码参考如下:

/**
     * 根据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方法里边进行删除。

     /**
     * 删除阿里云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文件的上传和删除已经写完了。当初自己也是遇到了很多问题,发现从网上找,竟然找不到理想的参考代码。所以才写了这几篇文章。希望对大家的开发有所帮助。毕竟水平有限,如果遇到考虑不周或者代码有误的地方,欢迎私信交流,谢谢。

您需要登录后才可以评论。登录 | 立即注册