当前位置:Gxlcms > PHP教程 > thinkphp3.1多文件上传图片和文档,怎么保存在不同的文件夹?

thinkphp3.1多文件上传图片和文档,怎么保存在不同的文件夹?

时间:2021-07-01 10:21:17 帮助过:24人阅读

thinkphp3.1 上传图片和文档,怎么分开保存?


回复讨论(解决方案)

根据文件后缀,判断上传目录选择

根据文件后缀,判断上传目录选择


$upload->savePath= './Public/image/home/news/';

if(!$upload->upload()) {// 上传错误提示错误信息
$this->error($upload->getErrorMsg());
}else{// 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}
这个上传目录不是只能设置一个么,怎么设置两个,thinkphp上传类第一次用。

thinkphp3.1 没有提供相应的方案,所以需要你自己设计
你可以继承 UploadFile 类,重写 save 方法
也可以用自己的上传类完成

如果你可以获取文件后缀$type

if ($type == '.jpg'){
$upload->savePath= './Public/image/home/ new1/';
if(!$upload->upload()) {// 上传错误提示错误信息
$this->error($upload->getErrorMsg());
}else{// 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}
}else if ($type == '.txt'){
$upload->savePath= './Public/image/home /new2/';
if(!$upload->upload()) {// 上传错误提示错误信息
$this->error($upload->getErrorMsg());
}else{// 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}
}

如果我上传的是一个图片一个文档 2 个个文件呢?

如果你可以获取文件后缀$type

if ($type == '.jpg'){
$upload->savePath= './Public/image/home/ new1/';
if(!$upload->upload()) {// 上传错误提示错误信息
$this->error($upload->getErrorMsg());
}else{// 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}
}else if ($type == '.txt'){
$upload->savePath= './Public/image/home /new2/';
if(!$upload->upload()) {// 上传错误提示错误信息
$this->error($upload->getErrorMsg());
}else{// 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}
}

如果同时上传多个文件,应该会有多个file文件域吧?



这就对file判断不就是?

如果你愿意修改 UploadFile.class.php 文件的话,事情还是有转机的
把 getSaveName 方法中的(408行附近)
$saveName = $rule().".".$filename['extension'];
改成
$saveName = $rule($filename).".".$filename['extension'];

然后

$upload->savePath = '';$upload->saveRule = 'myFunction';

定义函数
function myFunction($filename) {  $p = in_array($filename['extension'], array('gif', 'jpg', 'png')) ? '图片路径' : '文档路径';  return $p . $filename['name'];}

由于之后还会加上后缀,所以 $filename['name'] 怎么变形你可随意

如果你愿意修改 UploadFile.class.php 文件的话,事情还是有转机的
把 getSaveName 方法中的(408行附近)
$saveName = $rule().".".$filename['extension'];
改成
$saveName = $rule($filename).".".$filename['extension'];

然后

$upload->savePath = '';$upload->saveRule = 'myFunction';

定义函数
function myFunction($filename) {  $p = in_array($filename['extension'], array('gif', 'jpg', 'png')) ? '图片路径' : '文档路径';  return $p . $filename['name'];}

由于之后还会加上后缀,所以 $filename['name'] 怎么变形你可随意


import('ORG.Net.UploadFile');
$upload = new UploadFile();// 实例化上传类
$upload->maxSize = 3145728;
$upload->savePath = '';
$upload->saveRule = 'myFunction';
if(!$upload->upload()) {// 上传错误提示错误信息
$this->error($upload->getErrorMsg());
}else{// 上传成功 获取上传文件信息
$info = $upload->getUploadFileInfo();
}



private function getSaveName($filename) {
$rule = $this->saveRule;
if(empty($rule)) {//没有定义命名规则,则保持文件名不变
$saveName = $filename['name'];
}else {
if(function_exists($rule)) {
//使用函数生成一个唯一文件标识号
$saveName = $rule($filename).".".$filename['extension'];
}else {
//使用给定的文件名作为标识号
$saveName = $rule.".".$filename['extension'];
}
}
if($this->autoSub) {
// 使用子目录保存文件
$filename['savename'] = $saveName;
$saveName = $this->getSubName($filename).$saveName;
}
return $saveName;
}






function my_filename() {
return date('ymdHis',time()).'_'.mt_rand();
}

function myFunction($filename) {
$p = in_array($filename['extension'], array('gif', 'jpg', 'png')) ? './Public/image/home/img/' : './Public/image/home/file/';
return $p . $filename[my_filename()];
}




改了,这三个地方,提示上传路径不存在。

是空的,我在上传目录不存在上一句输出了下。

既然你的 ./Public/image/home/ 是公共的,那么就
$upload->savePath = './Public/image/home/';
函数里只留 'img/' : 'file/'

既然你的 ./Public/image/home/ 是公共的,那么就
$upload->savePath = './Public/image/home/';
函数里只留 'img/' : 'file/'


版主大大,路径可以用了,不过现在是名字是空的了。
文件已经存在!./Public/image/home/img/.jpg

return $p . $filename[my_filename()];
应为
return $p . my_filename();

可直接写作

return $p . date('ymdHis_').mt_rand();

return $p . $filename[my_filename()];
应为
return $p . my_filename();

可直接写作

return $p . date('ymdHis_').mt_rand();

恩恩,谢谢版主大大了,第一次用框架,几个问题都是版主大大解决的。

人气教程排行