在做网站的文件上传功能时,遇到了不能删除文件的问题。


    我采用的方案是用户先上传到服务器,服务器再上传到阿里云的OSS,中间会有一个把图片临时存储到服务器的过程。使用php的@unlink(删除指定文件)方法时发现了删除失败的问题,很是疑惑。


    开始以为是路径名写错了,后来确认路径没有错误并且是绝对路径。删除失败的原因是图片仍然被进程占用,以至于删除失败。


    所以想要成功执行unlink操作,我们最好手动释放下文件对象,避免因为被其他线程或进程占用而导致删除失败,小呆萌如下:

public function upload()
{
    //获取上传文件
    $file = $this->request->file('file');
	
    if ($file) {
        // 移动文件到 uploads 目录下
        $info = $file->rule('date')->move(ROOT_PATH . 'public' . DS . 'uploads');
		
        if ($info) {//文件上传到服务器成功->接下来上传到OSS
            $filePath = ROOT_PATH . 'public' . DS . 'uploads/' . $info->getSaveName();
        	
            $oss = new Oss();
            $result = $oss->putObject($filePath); 
                  
            if ($result) { //上传到OSS成功                              
                unset($info);//解除图片的进程占用
                @unlink($filePath);
                return success(['avatar' => $result['fileSrc']], '头像更新成功');
            }
        }
    }
}