ThinkPHP3和ThinkPHP5 文件上传方法

tp5文件上传方法

如果是文件上传,form中一定要含有enctype="multipart/form-data",否则不起作用

单文件上传

模板中代码

<form action="{:url('upload')}" enctype="multipart/form-data" method="post">
			<input type="file" name="image" /> <br> 
			<input type="submit" value="上传" /> 
		</form> 

控制器代码

public function up()
	{
		return $this->fetch('index/up');
	}
	
	public function upload(){
    $file = request()->file('image');
    
    // 移动到框架应用根目录/public/uploads/ 目录下
    if($file){
        $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
        if($info){
            // 成功上传后 获取上传信息
            // 输出文件后缀
            echo $info->getExtension()."<br>";
            // 输出 目录名与上传后的文件名
            echo $info->getSaveName()."<br>";
            // 输出 42a79759f284b767dfcb2a0197904287.jpg
            echo $info->getFilename()."<br>"; 
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }
		}
	}

访问http://127.0.0.1/public/index.php/admin/index/up 上传文件后输出

jpg
20190515\16a7c975ea7fbf7dfb974337ec02f582.jpg
16a7c975ea7fbf7dfb974337ec02f582.jpg

多文件上传

模板文件

<form action="{:url('upload')}" enctype="multipart/form-data" method="post">
			<input type="file" name="image[]" /> <br> 
			<input type="file" name="image[]" /> <br> 
			<input type="file" name="image[]" /> <br>  
			<input type="submit" value="上传" /> 
		</form> 

控制器内容

public function upload(){
    // 获取表单上传文件
		$files = request()->file('image');
		foreach($files as $file){
			// 移动到框架应用根目录/public/uploads/ 目录下
			$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
			if($info){
				echo "上传成功";
			}else{
				// 上传失败获取错误信息
				echo $file->getError();
			}    
		}
	}

要注意,多文件上传不能用$this->success输出,否则会截断,导致只上传第一个便停止。

文件上传命名规则

$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');

改为

$info = $file->rule('md5')->move(ROOT_PATH . 'public' . DS . 'uploads');

则是使用md5规则,使用后生成的上传目录变为
ThinkPHP3和ThinkPHP5 文件上传方法

  • 最终生成后类似于/upload/72/f3bf1da3405725be763540d6601144.jpg这种
  • 因为用的是多文件上传,我传了3个文件,生成了3个文件夹,其中07,ba和bd则是生成后的文件夹,而每个文件夹中含有一个文件

注:这样的话,需要将其放置在某个特定文件夹中,不然的话会造成文件夹过多。

系统默认提供了几种上传命名规则,包括:

规则 描述
date 根据日期和微秒数生成
md5 对文件使用md5_file散列生成
sha1 对文件使用sha1_file散列生成

其中md5sha1规则会自动以散列值的前两个字符作为子目录,后面的散列值作为文件名

保留好传的原文件名称

$file->move('/home/www/upload/','');

v5.0.1以上版本可以统一使用hash方法获取文件散列值

// 获取表单上传文件
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$upload = $file->move('/home/www/upload/');
// 获取上传文件的hash散列值
echo $upload->hash('sha1');
echo $upload->hash('md5');

返回对象

上传成功后返回的仍然是一个File对象,除了File对象自身的方法外,并且可以使用SplFileObject的属性和方法,便于进行后续的文件处理。

 

tp3文件上传方法

共分为四个文件

上传路径定义:在index.php中进行常量定义
控制器:将内容往数据库内添加
模型:上传功能处理
模板页面:前面显示

上传路径定义

如果一个网站需要进行不同分类的不同上传路径定义,可以用这种方式进行定义。

定义直接写在在tp下的index.php文件中

#注:自定义的任何内容,要放在引入入口文件之前,否则不起作用
#定义工作路径
define('WORKING_PATH',str_replace('\\','/',__DIR__));
#定义上传根目录
define('UPLOAD_ROOT_PATH','/public/Upload/');


// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';

// 亲^_^ 后面不需要任何代码了 就是如此简单

下面部分是我们添加的上传路径代码

#注:自定义的任何内容,要放在引入入口文件之前,否则不起作用
#定义工作路径
define('WORKING_PATH',str_replace('\\','/',__DIR__));
#定义上传根目录
define('UPLOAD_ROOT_PATH','/public/Upload/');

控制器代码

public function add()
		{
			if(IS_POST)
			{
				$post = I('post.');
				$model = D('Doc');
				
				$result = $model->saveData($post,$_FILES['file']);
				
				if($result)
				{
					$this->success('添加成功',U('showlist'),3);
				}else{
					$this->error('添加失败');
				}
			}else{
				$this->display();
			}			
		}

模型中内容

class DocModel extends Model
	{
		public function saveData($post,$file)
		{
			#判断是否有文件需要处理
			if(!$file['error'])
			{
				#配置upload
				$cfg = array(
					'rootPath' => WORKING_PATH . UPLOAD_ROOT_PATH
				);
				#有文件处理上传
				#使用Upload类
				$upload = new \Think\Upload($cfg);
				$info = $upload -> uploadOne($file);
				
				if($info)
				{
					#上传成功,补全字段内容
					$post['filepath'] = UPLOAD_ROOT_PATH . $info['savepath'] . $info['savename'];
					$post['filename'] = $info['name'];
					$post['hasfile'] = 1;
				}
			}
			$post['addtime'] = time();
			
			return $result = $this->add($post);			
		}
	}

里面的$info打印出来是

ThinkPHP3和ThinkPHP5 文件上传方法
name是文件原名
savename是上传后名称
savepath是上传后的路径

前台模板

<form action="" method="post" enctype="multipart/form-data">
			<p>
				<label>标题:</label>
				<!-- 下面的abc用了字段映射,即数据库中的name,再下面的排序也用了映射 -->
				<input type="text" name="title">
			</p>
			<p>
				<label>附件:</label>
				<input type="file" name="file">
			</p>
			<p>
				<label>作者:</label>
				<input type="text" name="author">
			</p>
			<p>
				<label>内容:</label>
				<script name="content" id="editor" type="text/plain" style="width:1024px;height:300px;"></script>
			</p>
			<p>
				<a href="javascript:;" class="confirm">确定</a>
			</p>
		</form>

评论

大侠名号:   验证暗号: 点击我更换图片

修远兮

在这里记录每一点自己需要的知识

添加创始人微信,一起交流心得

推荐文章RECOMMEND