ThinkPHP5.0内置了一个文件处理烂败类 \think\File,缓行内置的文件上传 *** 作也是调用了该类进行处理的。
File类继承了PHP的SplFileObject类,因此可以调用SplFileObject类所有的属性和方法。
表单代码:
<form action="/index/index/upload" enctype="multipart/form-data" method="post"><input type="file" name="image" /> <br>
<input type="submit" value="上传" />
</form>
控制器代码:
public function upload(){// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image')
// 移动到框架应用根目录/public/uploads/ 目录下
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads')
if($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension()
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName()
// 输出 饥哪颤42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename()
}else{
// 上传失败获取错误信息
echo $file->getError()
}
}
move方法成功的话返回的是一个SplFileInfo对象,你可以对上传后的文件进行后续 *** 作,比如改名。
重复上传问题其实很好解决,下面提供两个简单的思路,请按需求选取。
1、银数行简单的但风险比较大【适合新增 *** 作,不适合修改 *** 作】。可以使用命名规则进行判断是否已上传。
举个简单的例子,如上传的按钮毕猛name="file",那命名的时候就以这个字段来命名,
如:file-{$date}.png
$date=date('Y-m-d')//当天的日期$fileimg = "file-{$date}.png"//上传的图片命名
这个方法虽然不是特别准确的覆盖,但是在一定程度上做到了覆盖。
如果你这个图片是不变的,类似logo类型的图片,那直接命名为logo.png,这样每次提交都会覆盖原来的图片,不会重复。
注意:这个覆盖 *** 作会把原来的图片覆盖了,也就是没办法恢复原来的图片。
2、修改 *** 作的时候,只有确定提交了才覆盖。
这个 *** 作比较复杂一点,简单说说就是修改的时候,上传的图片命名规则跟方法1一样,也就是每次修改的图片重复覆盖,但是不覆盖原来的图片,用户确定提交后再删除原来的图锋哗片,将图片路径换为新上传的图片路径。流程图如下:
//用户修改信息上传图片----上传图片命名:file_tmp.png----注意:这个图片命名跟原图片命名不同
多次重复上传修改---图片重复覆盖file_tmp.png
//用户最终确定上传图片
后台处理程序,获取图片的路径,unlink原来的图片路径(再次跟据修改的ID查询到图片路径,
进行删除),修改获取的图片命名rename将file_tmp.png改为file.png,将新的文件路径提交
更新。
以上就是两种处理图片重复的问题,希望能够帮助到你。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)