今天写socket的时候,有一个需要将文件上传到服务器,然后将文件上传到七牛云,然后删除服务器上的文件。 第一次写socket后的代码如下:
$type = input('param.type');
$qiniu = input('param.qiniu/d',0);
$file = request()->file('file');//dump($file);
$img_url = '';
if(!empty($file))
{
// 移动到框架应用根目录/index/public/uploads/ 目录下
$info = $file->validate(['ext' => 'jpg,png,gif,xls,xlsx'])->move(ROOT_PATH . 'index' . DS . 'public' . DS . $type);
if ($info) {
$filename = explode(DS,$info->getsaveName());
$img_url = '/public/'.$type.'/'.$filename[0].'/'.$filename[1];
}else{
$this->error2($file->getError());
}
}
if(empty($img_url)) {
$this->error2('上传失败');
}
if ($qiniu==1){
$img_url=Qiniu::video('.'.$img_url);
unlink('.'.$img_url);
}
$this->success2('', $img_url);
其中,在调试的时候,发现unlink会报Permission returned的错误,然后写了一个特殊的方法,对上传的文件进行unlink,发现可以删除成功,说明删除本身没有问题,所以可能上传后立即删除出现了问题,于是我翻阅了php指南,发现php在7.3.0更新日志中有这么一段话: Now Windows can also use unlink() to delete files who file handles仍在使用中。 在此之前不能删除。 但是,在关闭所有句柄之前重新创建文件仍然很困难。 由于我们的php版本是5.6,所以应该是因为文件句柄在使用后被解除链接,所以释放file变量并尝试删除它。 修改后:
$img_url=Qiniu::video('.'.$img_url);
unset($info);
unlink('.'.$img_url);
果然可以删除成功php 删除文件夹php 删除文件夹,确实是因为该文件还在使用。