ThinkPHP5.1教程66.上传功能
- 格式:pdf
- 大小:121.79 KB
- 文档页数:3
thinkphp6操作手册摘要:1.引言2.ThinkPHP 6 简介3.安装与配置4.基本功能4.1 控制器4.2 模型4.3 视图4.4 数据库操作4.5 URL 路由4.6 模板引擎4.7 缓存4.8 日志5.高级功能5.1 安全防护5.2 表单验证5.3 文件上传与下载5.4 图片处理5.5 邮件发送5.6 数据加密5.7 异步任务5.8 测试6.开发规范与技巧7.社区与资源8.结语正文:【引言】ThinkPHP 6 是一款国产的轻量级PHP 开发框架,以其简洁、高效、灵活的特点受到广大开发者的喜爱。
本文将为您详细介绍ThinkPHP 6 的操作手册,帮助您快速掌握这一强大的开发工具。
【ThinkPHP 6 简介】ThinkPHP 6 是基于PHP 7.2+开发的一款MVC 框架,继承了传统MVC 框架的优势,同时在许多方面进行了优化和创新,使得开发者能够更加高效地编写代码。
【安装与配置】要使用ThinkPHP 6,首先需要对其进行安装。
您可以使用Composer 工具进行安装,安装完成后,还需对配置文件进行适当的修改,以便满足您的项目需求。
【基本功能】ThinkPHP 6 提供了丰富的基本功能,包括控制器、模型、视图、数据库操作、URL 路由、模板引擎、缓存、日志等。
这些功能为开发者提供了强大的支持,使得开发过程变得更加简单、高效。
【高级功能】除了基本功能外,ThinkPHP 6 还提供了许多高级功能,如安全防护、表单验证、文件上传与下载、图片处理、邮件发送、数据加密、异步任务、测试等。
这些功能在实际开发中发挥着重要作用,帮助开发者解决各种问题。
【开发规范与技巧】为了保证代码的质量和可维护性,ThinkPHP 6 提供了一系列开发规范与技巧。
遵循这些规范,可以使得项目更加稳定、高效。
【社区与资源】ThinkPHP 6 拥有庞大的开发者社区,提供了丰富的学习资源。
开发者可以在社区中寻求帮助、分享经验,共同进步。
PHP中文件上传的实现方式在现代的网络应用中,文件上传已经成为了一项必不可少的功能。
无论是社交网络,还是云盘服务,都需要用户上传文件来实现其功能。
PHP作为一门流行的Web开发语言,其提供了简单易用的文件上传功能。
本文将对PHP中的文件上传功能进行讲解,并介绍其实现方式。
一、基本概念在介绍PHP中的文件上传实现方式之前,需要先了解一些基本概念。
在HTTP协议中,文件上传是通过POST方法来完成的。
通过POST方法传输数据时,数据会被分成多个部分,每个部分头部都包含了一些元数据,用于描述数据的内容。
其中,文件上传时,数据被分为两个部分:第一个部分包含了上传文件的元数据;第二个部分包含了上传的文件数据。
二、文件上传步骤在PHP中实现文件上传功能,主要需要完成以下步骤:1. 显示上传表单首先需要具备一个上传表单,用于接收上传文件。
上传表单通过HTML实现,如下所示:<form method="POST" enctype="multipart/form-data"action="upload.php"><input type="file" name="file"><input type="submit" value="上传"></form>其中,enctype属性设置为multipart/form-data,可以告诉服务器该表单采用文件上传方式。
2. 接收上传文件当用户提交表单后,PHP脚本需要接收上传的文件。
PHP通过$_FILES超全局变量来接收上传文件。
$_FILES变量是一个二维数组,主要包含了以下几个信息:- $_FILES["file"]["name"]: 上传文件的名称- $_FILES["file"]["type"]: 上传文件的类型- $_FILES["file"]["size"]: 上传文件的大小- $_FILES["file"]["tmp_name"]: 上传文件在服务器上的临时存储路径- $_FILES["file"]["error"]: 上传文件时出现的错误信息(如果有)PHP可以通过以下代码获取上传文件:$file = $_FILES["file"];3. 检查上传文件在接收上传文件后,需要对上传文件进行检查。
ThinkPHP中文件上传上传表单在ThinkPHP中使用上传功能无需进行特别处理。
例如,下面是一个带有附件上传的表单提交:1.<form action="__URL__/upload"enctype="multipart/form-data"method="post">2.<input type="text"name="name"/>3.<input type="file"name="photo"/>4.<input type="submit"value="提交">5.</form>注意,要使用上传功能你的表单需要设置enctype="multipart/form-data"多文件上传支持如果需要使用多个文件上传,只需要修改表单,把1.<input type='file'name='photo'>改为1.<input type='file'name='photo1'>2.<input type='file'name='photo2'>3.<input type='file'name='photo3'>或者1.<input type='file'name='photo[]'>2.<input type='file'name='photo[]'>3.<input type='file'name='photo[]'>两种方式的多附件上传系统的文件上传类都可以自动识别。
Thinkphp框架+Layui实现图⽚⽂件上传功能分析本⽂实例讲述了Thinkphp框架+Layui实现图⽚/⽂件上传功能。
分享给⼤家供⼤家参考,具体如下:在项⽬中⽤到了,再⽹上找了现成的代码都是借⼝异常或者⾮法上传,所以在⼀番摸索搞定之后拿来和⼤家分享。
html:<form class="layui-form layui-form-pane" action="" style="margin-top:20px;" enctype="multipart/form-data"><center><div class="layui-upload-drag" id="uploadBanner"><img class="layui-upload-img" id="upload-photo"><i class="layui-icon" id="upload-icon"> </i><p>点击上传,或将⽂件拖拽到此处</p><p>建议尺⼨1920*512</p></div><input type="hidden" id="res" name="banner_photo" value="" lay-verify="required" /><div class="layui-form-item" style="margin-top:10px;"><button class="layui-btn" lay-submit="" lay-filter="sub">提交</button></div><div id="demoText"></div></center></form>JS:e('upload', function(){var $ = layui.jquery,upload = layui.upload;//普通图⽚上传var uploadInst = upload.render({elem: '#uploadBanner',url: "{:U('Api/doUploadPic')}",before: function(obj){//预读本地⽂件⽰例,不⽀持ie8obj.preview(function(index, file, result){$('#upload-photo').attr('src', result); //图⽚链接(base64)$('#upload-photo').attr('style', 'height:10rem;');$('#upload-icon').attr('style','display:none;');});},done: function(res, index, upload){//如果上传失败if(res.code > 0){return layer.msg('上传失败');}//上传成功console.log("成功啦!" + obj2string(res) + " " + index + " " + upload);},error: function(){//演⽰失败状态,并实现重传var demoText = $('#demoText');demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');demoText.find('.demo-reload').on('click', function(){uploadInst.upload();});}});});PHP接⼝:public function doUploadPic()//上传模块{$upload = new \Think\Upload();$upload->maxSize = 3145728;$upload->exts = array('jpg', 'gif', 'png', 'jpeg');$upload->rootPath = './Public/'; // 设置附件上传根⽬录$upload->savePath = 'upload/'; // 设置附件上传⼦⽬录$info = $upload->upload();if(!$info){$this->error($upload->getError());}else{foreach($info as $file){$data = '/Public'.$file['savepath'] . $file['savename'];$file_a=$data;echo '{"code":0,"msg":"成功上传","data":{"src":"'.$file_a.'"}}';}}}图⽚就上传到/Public/upload⽂件夹下了:更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《》。
超好⽤的thinkphp5.0thinkphp5.1分页插件!详细使⽤步骤(内附代码)效果tp5.0使⽤⽅法page下载地址: 提取码:s75k1,把page⽂件夹整个⽬录复制到⽬录extend下2,修改默认配置 app/config.php把⾥⾯的'paginate' => ['type' => 'page\Page',//修改这个原始为bootstrap'var_page' => 'page','list_rows' => 5,],3,控制器中 ,参考⼀下$name=$request->param('name');//接受参数⼀定要⽤param接收可以接收post和get$where=[['status','eq',1]];if (!empty($name)){$where[]=['name','like',"%$name%"];}$delList=Db::table('staff')->where($where)->order('id asc')->paginate(4,false,['query'=>$request->param()]);4,视图中{$delList->render()}tp5.1使⽤⽅法1,把page⽂件夹整个⽬录复制到⽬录extend下2,控制器中的⽅法public function index(Request $request){$name=$request->param('name');//接受参数⼀定要⽤param接收可以接收post和get$where=[['status','eq',1]];if (!empty($name)){$where[]=['name','like',"%$name%"];}$list=Db::table('staff')->where($where)->order('id asc')->paginate(12,false,['query'=>$request->param(),'type' => 'page\Page','var_page' => 'page']); $page=$list->render();//paginate第⼀个参数为每页显⽰的条数//paginate第⼆个参数为简单模式或总数//paginate第三个参数为分页的条件也可以写数组//总条数$allData=Db::table('staff')->where('status',1)->count();$this->assign('list',$list);$this->assign('page',$page);$this->assign('count',$allData);return $this->fetch('staff-list');}3,视图中,⼀定要写raw,具体含义看⽂档{$page|raw}Page.php 如下图<?phpnamespace page;// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK ]// +----------------------------------------------------------------------// | Copyright (c) 2006~2017 All rights reserved.// +----------------------------------------------------------------------// | Licensed ( /licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: zhangyajun <448901948@>// +----------------------------------------------------------------------use think\Paginator;class Page extends Paginator{//⾸页protected function home() {if ($this->currentPage() > 1) {return "<a href='" . $this->url(1) . "' title='⾸页'>⾸页</a>";} else {return "<p>⾸页</p>";}}//上⼀页protected function prev() {if ($this->currentPage() > 1) {return "<a href='" . $this->url($this->currentPage - 1) . "' title='上⼀页'>上⼀页</a>";} else {return "<p>上⼀页</p>";}}//下⼀页protected function next() {if ($this->hasMore) {return "<a href='" . $this->url($this->currentPage + 1) . "' title='下⼀页'>下⼀页</a>";} else {return"<p>下⼀页</p>";}}//尾页protected function last() {if ($this->hasMore) {return "<a href='" . $this->url($this->lastPage) . "' title='尾页'>尾页</a>";} else {return "<p>尾页</p>";}}//统计信息protected function info(){return "<p class='pageRemark'>共<b>" . $this->lastPage ."</b>页 <b>" . $this->total . "</b>条数据</p>";}/*** 页码按钮* @return string*/protected function getLinks(){$block = ['first' => null,'slider' => null,'last' => null];$side = 3;$window = $side * 2;if ($this->lastPage < $window + 6) {$block['first'] = $this->getUrlRange(1, $this->lastPage);} elseif ($this->currentPage <= $window) {$block['first'] = $this->getUrlRange(1, $window + 2);$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);} elseif ($this->currentPage > ($this->lastPage - $window)) {$block['first'] = $this->getUrlRange(1, 2);$block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage);} else {$block['first'] = $this->getUrlRange(1, 2);$block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);}$html = '';if (is_array($block['first'])) {$html .= $this->getUrlLinks($block['first']);}if (is_array($block['slider'])) {$html .= $this->getDots();$html .= $this->getUrlLinks($block['slider']);}if (is_array($block['last'])) {$html .= $this->getDots();$html .= $this->getUrlLinks($block['last']);}return$html;}/*** 渲染分页html* @return mixed*/public function render(){if ($this->hasPages()) {if ($this->simple) {return sprintf('%s<div class="pagination">%s %s %s</div>',$this->css(),$this->prev(),$this->getLinks(),$this->next());} else {return sprintf('%s<div class="pagination">%s %s %s %s %s %s</div>',$this->css(),$this->home(),$this->prev(),$this->getLinks(),$this->next(),$this->last(),$this->info());}}}/*** ⽣成⼀个可点击的按钮** @param string $url* @param int $page* @return string*/protected function getAvailablePageWrapper($url, $page){return '<a href="' . htmlentities($url) . '" title="第"'. $page .'"页" >' . $page . '</a>';}/*** ⽣成⼀个禁⽤的按钮** @param string $text* @return string*/protected function getDisabledTextWrapper($text){return '<p class="pageEllipsis">' . $text . '</p>';}/*** ⽣成⼀个激活的按钮** @param string $text* @return string*/protected function getActivePageWrapper($text){return '<a href="" class="cur">' . $text . '</a>';}/*** ⽣成省略号按钮** @return string*/protected function getDots(){return$this->getDisabledTextWrapper('...');}/*** 批量⽣成页码按钮.** @param array $urls* @return string*/protected function getUrlLinks(array$urls){$html = '';foreach ($urls as$page => $url) {$html .= $this->getPageLinkWrapper($url, $page); }return$html;}/*** ⽣成普通页码按钮** @param string $url* @param int $page* @return string*/protected function getPageLinkWrapper($url, $page){if ($page == $this->currentPage()) {return$this->getActivePageWrapper($page);}return$this->getAvailablePageWrapper($url, $page); }/*** 分页样式*/protected function css(){return ' <style type="text/css">.pagination p{margin:0;cursor:pointer}.pagination{height:40px;padding:20px 0px;}.pagination a{display:block;float:left;margin-right:10px;padding:2px 12px;height:24px;border:1px #cccccc solid;background:#fff;text-decoration:none;color:#808080;font-size:12px;line-height:24px;}.pagination a:hover{color:#077ee3;background: white;border:1px #077ee3 solid;}.pagination a.cur{border:none;background:#077ee3;color:#fff;}.pagination p{float:left;padding:2px 12px;font-size:12px;height:24px;line-height:24px;color:#bbb;border:1px #ccc solid;background:#fcfcfc;margin-right:8px;}.pagination p.pageRemark{border-style:none;background:none;margin-right:0px;padding:4px 0px;color:#666;}.pagination p.pageRemark b{color:red;}.pagination p.pageEllipsis{border-style:none;background:none;padding:4px 0px;color:#808080;}.dates li {font-size: 14px;margin:20px 0}.dates li span{float:right}</style>';}}-----------------------------------------------------------------------优化如下:。
php文件怎么上传php文件怎么上传主要介绍了php文件上传你必须知道的几点,只有真正的理解了这些知识点,打好基础,才能熟练掌握php文件上传功能的实现。
本篇文章主要说明的是与php文件上传的相关配置的`知识点。
PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。
打开php.ini配置文件找到File Uploadsfile_uploads = On默认允许HTTP文件上传,此选项不能设置为OFF。
upload_tmp_dir =默认为空,此选项在手动配置PHP运行环境时,也容易遗忘,如果不配置这个选项,文件上传功能就无法实现,这个选项设置的是文件上传时存放文件的临时目录,你必须给这个选项赋值,比如upload_tmp_dir ='/leapsoulcn',代表在C盘目录下有一个leapsoulcn目录,和session配置一样,如果你是在linux环境下,你必须赋予这个目录可写权限。
如何上传超过8M的大文件?上传大文件主要涉及配置upload_max_filesize和post_max_size 两个选项。
php.ini配置文件中的默认文件上传大小为2M,php初学者容易犯的一个错误是在编写文件上传功能时通过设置上传文件最大大小的表单区域,即允许上传文件的最大值,max_file_size(隐藏值域)的值来规定上传文件的大小,其实一般别人可以绕过这个值,所以安全起见,最好是在php.ini配置文件中配置upload_max_filesize选项,设定文件上传的大小。
默认upload_max_filesize = 2M,即文件上传的大小为2M,如果你想上传超过8M的文件,比如20M,你必须设定upload_max_filesize = 20M。
但是光设置upload_max_filesize = 20M还是无法实现大文件的上传功能,你必须修改php.ini配置文件中的post_max_size选项,其代表允许POST的数据最大字节长度,默认为8M。
thinkphp filesystem 用法ThinkPHP 5.1 文件系统(FileSystem)的用法引言:在现代的 Web 应用程序开发中,处理文件操作是非常常见的需求。
ThinkPHP 5.1 作为一款基于 PHP 的开发框架,提供了强大的文件系统(FileSystem)组件,可方便地对文件进行读写、存储、移动和删除等操作。
本文将针对 ThinkPHP 5.1 文件系统的用法进行详细讲解,以帮助读者更好地理解和应用该组件。
1. ThinkPHP 5.1 文件系统组件简介文件系统组件是 ThinkPHP 5.1 中一个非常重要的模块。
它提供了一系列的方法,使开发者可以轻松处理文件相关的操作。
其主要包括以下几个核心类:File、Filesystem、Image 和 Video。
在本文中,我们主要关注 Filesystem 类,它提供了对文件和目录的便捷操作。
2. Filesystem 类的基本用法(1)使用命名空间引入 Filesystem 类为了使用 Filesystem 类,我们首先需要在代码中引入正确的命名空间。
可以通过以下代码实现:phpuse think\facade\Filesystem;这样我们就可以在代码中直接使用 Filesystem 类提供的方法了。
(2)创建 Filesystem 实例在使用 Filesystem 类的方法之前,我们需要先创建一个 Filesystem 实例。
可以通过以下代码实现:phpfilesystem = new Filesystem();创建成功后,我们可以通过 filesystem 变量来调用 Filesystem 类的方法。
(3)文件的读写操作使用 Filesystem 类可以很方便地进行文件的读写操作。
例如,我们可以通过以下代码将文件内容写入到指定的文件中:phpfilesystem>put('path/to/file.txt', 'Hello, ThinkPHP Filesystem!');上述代码中的 'path/to/file.txt' 为文件的相对路径,'Hello, ThinkPHP Filesystem!' 为要写入的内容。
php的⽂件上传⼊门教程(实例讲解)⼀、⽂件上传为了让客户端的⽤户能够上传⽂件,我们必须在⽤户界⾯中提供⼀个表单⽤于提交上传⽂件的请求。
由于上传的⽂件是⼀种特殊数据,不同于其它的post数据,所以我们必须给表单设置⼀个特殊的编码:复制代码代码如下:<form action="upload.php" method="POST" enctype="multipart/form-data"></form>以上的enctype属性,你可能不太熟悉,因为这常常会被忽略掉。
但是,如果http post请求中既有常规数据,⼜包含⽂件类数据的话,这个属性就应该显⽰加上,这样可以提⾼针对各种浏览器的兼容性。
接下来,我们得向表单中添加⼀个⽤于上传⽂件的字段:复制代码代码如下:<input type="file" name="attachment">上述⽂件字段在各种浏览器中可能表现会有所不同。
对于⼤多数的浏览器,上述字段都会被渲染成⼀个⽂本框加上⼀个浏览按钮。
这样,⽤户既可以⾃⾏输⼊⽂件的路径到⽂本框中,也可以通过浏览按钮从本地硬盘上选择所要上传的⽂件。
但是,在苹果的Safari中,貌似只能使⽤浏览这种⽅式。
当然,你也可以⾃定义这个上传框的样式,使它看起来⽐默认的样式优雅些。
下⾯,为了更好的阐述怎么样处理⽂件上传,举⼀个完整的例⼦。
⽐如,以下⼀个表单允许⽤户向我的本地服务器上上传附件:复制代码代码如下:<p>请上传你的附件:</p><form action="upload.php" method="POST" enctype="multipart/form-data"><input type="file" name="attachment"><input type="submit" value="上传附件"></form>提⽰:可以通过php.ini中的upload_max_filesize来设置允许上传⽂件的最⼤值。
thinkphp框架文章发布功能开发的方法
要开发一个文章发布功能,你可以使用ThinkPHP框架中的以
下步骤进行开发:
1. 创建数据库表:首先,你需要为文章发布功能创建一个数据库表。
表可以包含标题、内容、作者、发布时间等字段。
2. 创建模型:使用ThinkPHP框架的模型功能,创建一个与文
章相关的模型。
这个模型可以定义与数据库表的关联关系,以及一些常用的数据库操作方法。
3. 创建控制器:创建一个控制器用于处理文章发布功能的逻辑。
在控制器中,你可以处理用户提交的文章数据,调用模型的方法将数据保存到数据库中。
4. 创建视图:创建一个视图用于展示文章发布表单。
在视图中,你可以使用HTML和ThinkPHP的模板语法来设计一个用户友好的表单界面。
5. 表单验证:对用户提交的数据进行验证,确保数据的完整性和正确性。
你可以使用ThinkPHP的表单验证功能来进行验证。
6. 提交表单:在视图表单中设置一个提交按钮,在用户点击提交按钮时,将用户输入的数据提交到控制器中进行处理。
7. 文章列表页:开发一个文章列表页面,用于展示已发布的文章信息。
你可以在控制器中查询数据库中已发布的文章,然后
将数据传递给视图进行展示。
8. 文章详情页:开发一个文章详情页面,用于展示指定文章的详细内容。
你可以在控制器中根据文章ID查询数据库中对应的文章内容,然后将数据传递给视图进行展示。
以上是一个简单的开发思路,你可以根据具体需求进行适当的修改和扩展。
thinkphp5.1 路由方法传递参数在ThinkPHP 5.1中,路由方法可以通过参数传递参数。
路由参数是定义在路由规则中的变量部分,可以在访问路由时传递相应的值。
下面是一个示例,演示如何在ThinkPHP 5.1的路由方法中传递参数:
1. 定义路由规则:
Route::get('user/:id', 'Index/getUser');
在上面的例子中,:id 是一个路由参数,表示用户ID。
2. 在控制器的方法中接收路由参数:
public function getUser($id)
{
// 获取传递的路由参数值
$userId = $id;
// 进行相应的处理逻辑
// ...
}
在上面的例子中,getUser 方法接收一个参数$id,它对应于路由规则中的:id。
你可以根据需要在方法中使用$id 进行相应的处理逻辑。
当访问user/123 时,getUser 方法将被调用,并且$id 的值将被设置为123。
你可以根据$id 进行相应的操作,例如根据用户ID获取用户信息等。
这就是在ThinkPHP 5.1中通过路由方法传递参数的基本方式。
你可以根据实际需求定义更多的路由规则和参数,并在控制器的方法中使用它们。
php实现⽹页常见⽂件上传功能⽤php实现⽹页常见的⽂件上传功能,供⼤家参考,具体内容如下上传页⾯<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><!--上传⽂件 enctype="multipart/form-data"指的是编码⽅式为上传多种类型⽂件和数据流--><form method="post" action="123.php" enctype="multipart/form-data"><input type="file" name="file"><input type="submit" value="上传"></form></body></html>⽂件处理页⾯<?php/*** Created by fcc* User: Administrator* Date: 2017/10/31* Time: 10:33*/var_dump($_FILES);//⽂件处理要实现的⼏点//1.是否有错误//2.⽂件类型是否符合要求//3.⽂件⼤⼩是否符合要求//4.⽂件名是否重复//$types = ['image/jpeg','image/png'];if (!$_FILES['file']['error']){if ($_FILES['file']['type'] == 'image/jpeg'){if ($_FILES['file']['size']<200000){//⽂件传到⽂件夹中,可以拼接时间戳,⽤户名等防⽌⽂件名重复$file_name = "./upload/2017-10-31/".$_FILES['file']['name'];if (!file_exists($file_name)){move_uploaded_file($_FILES['file']['tmp_name'],$file_name);// $filename=iconv("UTF-8","",$file_name);}else{echo "⽂件名重复";}}else{echo "⽂件过⼤";}}else{echo "⽂件格式错误";}}//实验过程中出现因为图⽚汉字命名报错以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Thinkphp中的多文件上传FileAction.class.php<?phpclass FileAction extends Action {public function Index(){//print_r(__URL__);$file = M('file');$list = $file->select();$this->assign('filelist',$list);$this->display();}public function upload(){//文件上传的地址上传给它,并且上传完成后返回一个信息,让其写入数据库//如果$_FILES为空的画,我就让action给出一个错误提示,告诉用户必须选择上传文件。
如果有上传文件,则调用up方法//$_FILES = $this->_post('file');//print_r($_FILES);if (empty($_FILES)) {$this->error('必须选择上传文件');}else {$a = $this->Up();//print_r($a);if (isset($a)) {//写入数据库方法if($this->c($a)) {$this->success('上传成功');}else {$this->error('写入数据库失败');}}else {$this->error('上传文件有异常请与系统管理员联系');}}}private function c($data){//print_r($data);$file=M('file');$num = '0';for($i = 0; $i < count($data)-1; $i++) {$data['filename']=$data[$i]['savename'];if( $file->data($data)->add()){$num++;}}if($num==count($data)-1){return true;}else {return false;}}// private function c($data)// {// $file = M('file');// $data['filename'] = $data[0]['savename'];// if ($file->data($data)->add()) {// return true;// }else {// return false;// }// }//在这个方法当中,完成与thinkphp相关的,文件上传类的调用private function Up(){//echo '模拟上传';//基本上传功能//批量上传功能//生成图片缩略图//自定义参数上传//上传检测(大小,后缀,mime类型)//支持覆盖方式上传//上传类型,附件大小,上传路径定义//支持hash或者日期子目录保存上传文件//上传图片的安全性检测//对上传文件的hash检测//上传文件名自定义规范import('@.ORG.UploadFile');import('@.ORG.Image');$upload = new UploadFile();$upload->maxSize = '1000000'; //指上传文件大小,默认为-1,不限制大小(bytes)$upload->savePath = './Public/'; //上传保存到什么地方?路径建议保存到入口文件平级或平级目录的子目录$upload->saveRule = 'uniqid'; //上传文件的文件名保存规则time uniqid(默认) com_create_guid$upload->hashType = 'md5_file';$upload->autoCheck = true; //是否自动检测附件默认true$upload->uploadReplace = true; //如果存在同名文件是否进行覆盖$upload->allowExts = array('jpg','jpeg','png','gif'); //允许上传的文件后缀$upload->allowPath = array('image/png','image/jpg','image/pjpeg','image/gif','image/jpeg'); //检测mime类型$upload->thumb = true; // 是否开启图片文件缩略$upload->thumbMaxWidth = '300,500';//缩略图最大宽度$upload->thumbMaxHeight = '200,400';//最大高度$upload->thumbPrefix = 's-,m-';//缩略图文件前缀//$upload->thumbSuffix = '_s,_m';//文件后缀//$upload->thumbPath = '';//如果留空直接上传至//$upload->thumbFile 在数据库中也存一个文件名即可$upload->thumbRemoveOrigin = 1; //如果生成缩略图,是否删除原图//$upload->autoSub 是否使用子目录进行保存上传文件//$upload->subType='' 子目录创建方式默认为hash 也可以为date//$upload->dateFormat 子目录方式date的指定日期格式//$upload->hashLevle//upload() 如果上传成功返回true,失败返回falseif ($upload->upload()) {$info = $upload->getUploadFileInfo();return $info;}else {//是专门来获取上传的错误信息的$this->error($upload->getErrorMsg());}}}?>Index.html<!DOCTYPE html><html><body><volist name="filelist" id="vo">小图<img src="__PUBLIC__/s-{$vo.filename}"><br>大图<img src="__PUBLIC__/m-{$vo.filename}"></volist><form action="__URL__/upload" method="POST" enctype="multipart/form-data"><input type="file" name="file[]"><br><input type="file" name="file[]"><br><input type="file" name="file[]"><br><input type="submit" value="上传"></form></body></html>。
ThinkPHP实现附件上传功能刚学的使⽤ThinkPHP框架简单上传附件(图⽚,⽂档,视频等⽂件)⾸先需要了解tp框架中Upload.class.php(ThinkPHP/Library/Think/Upload,class,php)中的⼏个函数1:getError() 获取上传错误信息2:uploadOne() 上传单个⽂件3:upload() 上传多个⽂件4:rootPath 上传⽂件保存根路径代码如下前台:<td>商品图⽚</td><td><input type="file" name="goods_pic" /></td>控制器//处理上传附件图⽚//判断是否上传 4:没有上传附件if ($_FILES['goods_pic']['error']<4) {//上传$cfg = array('rootPath' => './Public/uploads/', //保存根路径);$upload = new \Think\Upload($cfg); //完全限定名称实例化对象//uploadOne()⽅法执⾏成功后会把附件(在服务器上)的名字和路径等相关信息返回$file_info=$upload->uploadOne($_FILES['goods_pic']);//把上传好的附件存到数据库拼接路径//$upload->rootPath通过⽗类upload.class.php中的__get()⽅法获取配置中的rootPath$_POST['goods_big_img']=$upload->rootPath.$file_info['savepath'].$file_info['savename'];}如果对上传附件有其他要求,可参考⽗类Upload.class.php中上传配置config参数进⾏选择需要的参数,只需在上⾯代码$cfg=array()中重写即可!⽗类上传配置参数如下(可根据⾃⼰要求重写):private $config = array('mimes' => array(), //允许上传的⽂件MiMe类型'maxSize' => 0, //上传的⽂件⼤⼩限制 (0-不做限制)'exts' => array(), //允许上传的⽂件后缀'autoSub' => true, //⾃动⼦⽬录保存⽂件'subName' => array('date', 'Y-m-d'), //⼦⽬录创建⽅式,[0]-函数名,[1]-参数,多个参数使⽤数组'rootPath' => './Uploads/', //保存根路径'savePath' => '', //保存路径'saveName' => array('uniqid', ''), //上传⽂件命名规则,[0]-函数名,[1]-参数,多个参数使⽤数组'saveExt' => '', //⽂件保存后缀,空则使⽤原后缀'replace' => false, //存在同名是否覆盖'hash' => true, //是否⽣成hash编码'callback' => false, //检测⽂件是否存在回调,如果存在返回⽂件信息数组'driver' => '', // ⽂件上传驱动'driverConfig' => array(), // 上传驱动配置);以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Thinkphp5+plupload图⽚上传功能,⽀持实时预览图⽚。
今天和⼤家分享⼀个国外的图⽚上传插件,这个插件⽀持分⽚上传⼤⽂件。
其中著名的七⽜云平台的jssdk就使⽤了puupload插件,可见这个插件还是相当⽜叉的。
这个插件不仅仅⽀持图⽚上传,还⽀持⼤多数⽂件的上传,例如视频⽂件,⾳频⽂件,word⽂件等等,⽽且⼤⽂件都采⽤分⽚上传的机制。
Plupload有以下功能和特点:1、拥有多种上传⽅式:HTML5、flash、silverlight以及传统的<input type=”file” />。
Plupload会⾃动侦测当前的环境,选择最合适的上传⽅式,并且会优先使⽤HTML5的⽅式。
所以你完全不⽤去操⼼当前的浏览器⽀持哪些上传⽅式,Plupload会⾃动为你选择最合适的⽅式。
2、⽀持以拖拽的⽅式来选取要上传的⽂件3、⽀持在前端压缩图⽚,即在图⽚⽂件还未上传之前就对它进⾏压缩4、可以直接读取原⽣的⽂件数据,这样的好处就是例如可以在图⽚⽂件还未上传之前就能把它显⽰在页⾯上预览5、⽀持把⼤⽂件切割成⼩⽚进⾏上传,因为有些浏览器对很⼤的⽂件⽐如⼏G的⼀些⽂件⽆法上传。
下⾯就介绍⼀个tp5整合plupload图⽚上传插件的⼩案例,希望给⼤家带来⼀点⼩帮助。
⼀、案例⽬录结构⼆、Index.php控制器⽅法<?phpnamespace app\index\controller;use think\Controller;use think\Db;class Index extends Controller{public function index(){$rootUrl = $this->request->root(true); //ROOT域名$rootUrl = explode('index.php',$rootUrl)[0];//模板资源变量分配foreach (config('TMPL_PARSE_STRING') as $key => $value) {$this->view->assign('_'.$key,$rootUrl.$value);}return $this->fetch();}//图⽚上传⽅法public function upload_images(){if($this->request->isPost()){//接收参数$images = $this->request->file('file');//计算md5和sha1散列值,TODO::作⽤避免⽂件重复上传$md5 = $images->hash('md5');$sha1= $images->hash('sha1');//判断图⽚⽂件是否已经上传$img = Db::name('picture')->where(['md5'=>$md5,'sha1'=>$sha1])->find();//我这⾥是将图⽚存⼊数据库,防⽌重复上传if(!empty($img)){return json(['status'=>1,'msg'=>'上传成功','data'=>['img_id'=>$img['id'],'img_url'=>$this->request->root(true).'/'.$img['path']]]);}else{// 移动到框架应⽤根⽬录/public/uploads/picture/⽬录下$imgPath = 'public' . DS . 'uploads' . DS . 'picture';$info = $images->move(ROOT_PATH . $imgPath);$path = 'public/uploads/picture/'.date('Ymd',time()).'/'.$info->getFilename();$data = ['path' => $path ,'md5' => $md5 ,'sha1' => $sha1 ,'status' => 1 ,'create_time' => time() ,];if($img_id=Db::name('picture')->insertGetId($data)){return json(['status'=>1,'msg'=>'上传成功','data'=>['img_id'=>$img_id,'img_url'=>$this->request->root(true).'/'.$path]]);}else{return json(['status'=>0,'msg'=>'写⼊数据库失败']);}}}else{return ['status'=>0,'msg'=>'⾮法请求!'];}}}三、index.html页⾯<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>tp5+plupload图⽚上传</title></head><body><!-- production --><!--<script type="text/javascript" src="./plupload.full.min.js"></script>--><!-- debug--><script type="text/javascript" src="{$_plupload}/moxie.js"></script><script type="text/javascript" src="{$_plupload}/plupload.dev.js"></script><script type="text/javascript" src="{$_plupload}/jquery.min.js"></script><style>ul{list-style:none;}#file-list {overflow: hidden;padding-left: initial;}#file-list li {width:160px;float: left;height:200px;position: relative;height: inherit;margin-bottom: inherit;}#file-list li a {width:150px;height:150px;text-align: center;display: flex;align-items: center;justify-content: center;margin:0 auto;border:1px solid #ccc;padding: 5px 5px 5px 5px;}.close{background-image: url("{$_plupload}/close.png");width: 30px;height: 30px;background-size: contain;position: absolute;right: 2%;top: 0;}#file-list li a img {max-width:100%;max-height: 100%;}.progress{position: absolute;background-color: rgba(4, 4, 4, 0.53);color: #fff;padding: 3px 3px 3px 3px;border-radius: 10%;}</style><input type="hidden" id="images_upload" name="images" value=""/><div id="container"><button class="btn btn-primary" type="button" id="pickfiles" style="height: 30px;line-height: 8px;">选择图⽚</button> <button class="btn btn-primary" type="button" id="uploadfiles" style="display: none">开始上传</button><ul id="file-list"></ul></div><script type="text/javascript">//调⽤例⼦var uploader = new plupload.Uploader({runtimes : 'html5,flash,silverlight,html4',//上传⽅式顺序优先级browse_button : 'pickfiles',//选择图⽚按钮idcontainer: document.getElementById('container'),//容器url : "{:url('Index/upload_images')}",//服务器接⼝地址flash_swf_url : "{$_plupload}/Moxie.swf",silverlight_xap_url : "{$_plupload}/Moxie.xap",multi_selection: true,//false为单图上传,true为多图上传filters : {max_file_size : '100mb',//限制⽂件上传⼤⼩mime_types: [{title : "Image files", extensions : "jpg,gif,png"},//限制⽂件上传格式]},init: {//init事件发⽣后触发PostInit: function() {//document.getElementById('filelist').innerHTML = '';document.getElementById('uploadfiles').onclick = function() {uploader.start();return false;};},FilesAdded: function(up, files) {//⽂件选择之后的触发的⽅法var len = len = files.length;for(var i = 0; i<len; i++){var file_name = files[i].name; //⽂件名var file_size = files[i].size;//⽂件⼤⼩//构造html来更新UI//var html = '<li id="file-' + files[i].id +'"><p class="file-name">' + file_name + '(' + plupload.formatSize(file_size) + ')' + '</p><p class="progress"></p></li>'; var html = '<li id="file-' + files[i].id +'"><span class="close"></span></li>';$(html).appendTo('#file-list');!function(i){previewImage(files[i],function(imgsrc){$('#file-'+files[i].id).append('<a><img src="'+ imgsrc +'" /><span class="progress">12</span></a>');})}(i);$("#uploadfiles").trigger('click');}/*plupload.each(files, function(file) {document.getElementById('filelist').innerHTML += '<div id="' + file.id + '">' + + ' (' + plupload.formatSize(file.size) + ') <b></b></div>';});*/},UploadProgress: function(up, file) {//上传过程中调⽤的⽅法//document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";$('#file-'+file.id +" .progress").html(file.percent + "%");},FileUploaded : function (up,file,res) {//⽂件上传完成后console.log(res.response);var data = JSON.parse(res.response).data;$('#file-'+file.id).children('.close').attr('img_id',data.img_id);var img = $("#images_upload");var str = img.val();if(str == ''){str = data.img_id;}else{str += ','+data.img_id;}img.val(str);},Error: function(up, err) {//document.getElementById('console').appendChild(document.createTextNode("\nError #" + err.code + ": " + err.message));}}});//plupload中为我们提供了mOxie对象//有关mOxie的介绍和说明请看:https:///moxiecode/moxie/wiki/API//file为plupload事件监听函数参数中的file对象,callback为预览图⽚准备完成的回调函数function previewImage(file,callback){if(!file || !/image\//.test(file.type)) return; //确保⽂件是图⽚if(file.type=='image/gif'){ //gif使⽤FileReader进⾏预览,因为mOxie.Image只⽀持jpg和pngvar gif = new moxie.file.FileReader();gif.onload = function(){callback(gif.result);gif.destroy();gif = null;};gif.readAsDataURL(file.getSource());}else{var image = new moxie.image.Image();image.onload = function() {image.downsize( 150, 150 );//先压缩⼀下要预览的图⽚,宽300,⾼300var imgsrc = image.type=='image/jpeg' ? image.getAsDataURL('image/jpeg',80) : image.getAsDataURL(); //得到图⽚src,实质为⼀个base64编码的数据callback && callback(imgsrc); //callback传⼊的参数为预览图⽚的urlimage.destroy();image = null;};image.load( file.getSource() );}}uploader.init();//移除图⽚$("#file-list").on('click',".close",function(){var img_id = $(this).attr("img_id");var img = $("#images_upload");var items=img.val().split(",");var index = items.indexOf(img_id);items.splice(index,1);//删除元素img.val(items.join(','));$(this).parent().remove();});</script></body></html>如果想研究插件源码的朋友,可以看这个⽂件,其中⼤部分都已经注释了。
Thinkphp5⾃定义上传⽂件名的实现⽅法这⼏天在做tp5的上传⽂件模块,项⽬需求是要把⽂件名在上传之后修改为⽤户名+原⽂件名的组合形式,在⽹上找了⼀会⼉发现好像没有类似的⽂章。
只好⾃⼰去研究研究了。
之前查看过看云上⾯的官⽅⼿册,⽂件上传那⼀块真的是讲的含糊,对于我们这个为了项⽬⾃学tp5的⼤学⽣来说到处都是知识盲区啊。
Tp5⽂件相关操作模块都在 thinkphp\library\think\File.php⾥⾯,我们找到第335⾏的move()函数/*** 移动⽂件* @access public* @param string $path 保存路径* @param string|bool $savename 保存的⽂件名默认⾃动⽣成* @param boolean $replace 同名⽂件是否覆盖* @return false|File*/public function move($path, $savename = true, $replace = true){上⾯写的$savename是⼀个String或者bool类型,所以直接传⼊⽂件名或者⽂件名变量就⾏了在⾃⼰的相关代码⾥写上:$saveName = 'Tom';$info = $file->move('./Upload',$saveName,false);再上传⼀次就可以看到上传的⽂件已经被修改为了Tom。
存进数据库的名字也是Tom,说明⽂件名是完全改了的。
由此可得,需要什么功能直接去框架的⽂件⾥⾯去找,感觉⽐看⼿册详细多了!总结以上所述是⼩编给⼤家介绍的Thinkphp5 ⾃定义上传⽂件名的实现⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
在此也⾮常感谢⼤家对⽹站的⽀持!如果你觉得本⽂对你有帮助,欢迎转载,烦请注明出处,谢谢!。
uniapp使⽤uview框架完成图⽚上传,后端Thinkphp5.1刚开始遇到了很多坑,为了避免⼤家踩坑,直接上代码: template<u-uploadref="uUpload":action="action":auto-upload="true"max-count="9"name="image"size-type="['compressed']"max-size="3145728"></u-upload><u-button @click="submit">提交</u-button> scriptdata() {return {// 服务器地址action: getApp().globalData.api_url +'/index/Api/upload',}},methods: {submit() {let files = [];// 通过filter,筛选出上传进度为100的⽂件(因为某些上传失败的⽂件,进度值不为100,这个是可选的操作)files = this.$refs.uUpload.lists.filter(val => {return val.progress == 100;})// 如果您不需要进⾏太多的处理,直接如下即可// files = this.$refs.uUpload.lists;console.log(files)},} PHP//接收图⽚信息并存在本地public function upload(){// 获取表单上传⽂件$file = request()->file('image');// 移动到框架应⽤根⽬录/uploads/ ⽬录下$info = $file->validate(['size'=>3145728,'ext'=>'jpg,png,gif,JPG,PNG'])->move( '../public/uploads');if($info){// 成功上传后获取上传信息$return_data = array('code'=>0,'msg'=>"图⽚上传成功!",'result'=>"uploads/".$info->getSaveName(),);return json_encode($return_data);}else{// 上传失败获取错误信息$return_data = array('code'=>1,'msg'=>$file->getError(),);return json_encode($return_data);}}。