最近开发网站用到了ThinkPHP 2.0的上传类库, 用来实现一个图片上传功能。
使用过程中发现,如果开启了子目录创建方式,则会出现一些问题:
public $autoSub = true;
1. 无法生成缩略图, 此问题的修复办法如下, 在 UploadFile.class.php 中找到 line#145
if ($this->thumb) { // 生成图像缩略图 import("@.ORG.Image"); $image = Image::getImageInfo($filename); if(false !== $image) { //是图像文件生成缩略图 $thumbWidth = explode(',',$this->thumbMaxWidth); $thumbHeight = explode(',',$this->thumbMaxHeight); $thumbPrefix = explode(',',$this->thumbPrefix); $thumbSuffix = explode(',',$this->thumbSuffix); $thumbFile = explode(',',$this->thumbFile); $thumbPath = $this->thumbPath?$this->thumbPath:$file['savepath']; for($i=0,$len=count($thumbWidth); $i<$len; $i++) { $thumbname = $thumbPath.$thumbPrefix[$i].substr($file['savename'],0,strrpos($file['savename'], '.')).$thumbSuffix[$i].'.'.$file['extension']; Image::thumb($filename,$thumbname,'',$thumbWidth[$i],$thumbHeight[$i],true); }
替换成为:
if ($this->thumb) { $file_savename = $file['savename']; $sub_path = ''; if ($this->autoSub) { // 使用子目录保存文件 $sub_path = $this->getSubName($file).'/'; $file_savename = str_replace($sub_path,'',$file_savename); } // 生成图像缩略图 import("@.ORG.Image"); $image = Image::getImageInfo($filename); if (false !== $image) { //是图像文件生成缩略图 $thumbWidth = explode(',',$this->thumbMaxWidth); $thumbHeight = explode(',',$this->thumbMaxHeight); $thumbPrefix = explode(',',$this->thumbPrefix); $thumbSuffix = explode(',',$this->thumbSuffix); $thumbFile = explode(',',$this->thumbFile); $thumbPath = $this->thumbPath?$this->thumbPath:$file['savepath']; $thumbPath = $thumbPath.$sub_path; for ($i=0,$len=count($thumbWidth); $i<$len; $i++) { $thumbname = $thumbPath.$thumbPrefix[$i].substr($file_savename,0,strrpos($file_savename, '.')).$thumbSuffix[$i].'.'.$file['extension']; Image::thumb($filename,$thumbname,'',$thumbWidth[$i],$thumbHeight[$i],true); }
2. 返回参数中没有包含缩略图的文件名,原始的返回参数如下:
$file['key'] = $key; $file['extension'] = $this->getExt($file['name']); $file['savepath'] = $savePath; $file['savename'] = $this->getSaveName($file);
savename 参数包含了子目录路径,保存缩略图路径到数据库的时候,还需要写额外的function替换出缩略图的存放路径。
我对此做了一些修改:
$file['key'] = $key; $file['extension'] = $this->getExt($file['name']); $file['savepath'] = $savePath; $file['subpath'] = ''; $savename = $this->getSaveName($file); $file['savename'] = $savename; if ($this->autoSub) { $file_save_name = explode('/', $savename); $file['subpath'] = $file_save_name[0].'/'; $file['savename'] = $file_save_name[1]; }
返回的参数中多了一个subpath用来存放子目录路径,savename不再包含子目录路径。
如果你的thumbPrefix是’thumb_’, 现在你只需
$thumb_path = $file['subpath'].'thumb_'.$file['savename']
我上传了修改后的UploadFile.class.php文件,你可以随意使用。如果你发现其他问题,欢迎留言讨论。
缩略图放进子目录。但是原文件上传后放了在子目录外!