### 图片上传(内置) ##### 单图上传 <blockquote class="danger"><p>TP自带内置上传功能, 这个内置的上传是表单提交之后直接上传. 无需另写上传功能. 也就是没有回调. 这样有一个好处就是没有多余的垃圾图片传到服务器内. 坏处就是没有回调, 在提交表单之前无法进行预览.</p> <p>由于TP内置图片上传, 无法使用ajax提交. 至少我没有找到方法. ajax就不走enctype="multipart/form-data"上传机制了. 所以内置上传不想绕过他的特性. 那么就直接用普通上传方式解决掉他.</p> <p>builder上传图片是通过ajax提交, 所以内置上传无法在builder公用里面进行使用. 那么我们就要新建页面处理他.builder上传图片, 请使用自定义上传来搞定.</p></blockquote> * 自己新建一个html文件,注意form表单里面要加入enctype="multipart/form-data"用于区分是否上传. * 我也不想新建, 直接用builder来生成最好. 但是用生成的无法通过ajax传值到后台. * 因为tp内置的上传只有在点击提交按钮的时候才走上传机制. 不然是无值的. * 没有办法, 我们就用创建的文件来搞这个事. * 那么以后就是, 第三方扩展上传图片(带回调)使用builder生成. * 如果要是用TP内置的上传, 那么就用创建文件, 通过submit点击提交进行上传. * 路径application/admin/view/index_nternalimg.html ~~~ {extend name="base"} {block name="body"} <div class="tpl-content-wrapper"> <ol class="am-breadcrumb"> <span class="layui-breadcrumb" lay-separator="-"> <a href="">首页</a> <a><cite>内置图片上传</cite></a> </span> </ol> <div class="tpl-portlet-components"> <div class="portlet-title"> <div class="caption font-green bold"> <span class="am-icon-code"></span> 内置图片上传测试 </div> </div> <div class="tpl-block "> <div class="am-g tpl-amazeui-form"> <div class="am-u-sm-12 am-u-md-9"> <form class="layui-form" action="" enctype="multipart/form-data" method="post"> <div class="layui-form-item"> <label class="layui-form-label">上传</label> <div class=""> <input type="file" name="single_img" > </div> </div> <div class="layui-form-item item_password "> <label class="layui-form-label">text上传</label> <div class="layui-input-block"> <input type="text" name="single_text" id="single_text" value="" required="" lay-verify="required" placeholder="请填写text上传" autocomplete="off" class="layui-input" > </div> </div> <div class="layui-form-item"> <label class="layui-form-label">多图上传1</label> <div class=""> <input type="file" name="figure[]" > </div> </div> <div class="layui-form-item"> <label class="layui-form-label">多图上传2</label> <div class=""> <input type="file" name="figure[]" > </div> </div> <div class="layui-form-item"> <label class="layui-form-label">多图上传3</label> <div class=""> <input type="file" name="figure[]" > </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit >立即提交</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> <div id="demo4" style="float:right"></div> </div> </div> </div> </div> </div> </div> {/block} ~~~ * 路径application/admin/controller/index.php * 前面注释的是单图直接上传, 这样的话无需处理图片不改变板式直接上传服务器内. * 没有注释的是图片经过处理的. single_img是我封装好的.拿来直接调用即可. 路径已经标注. * HYQingKongTiJ.ttf 水印文字是百度下的. 同时TP官网给出的也是这个.因为那个1,2,3,4,5不支持中文. * 此处包含单图上传, 单图处理后上传, 多图处理后上传. * 图片处理记得安装插件 composer require topthink/think-image ~~~ public function NternalImg(){ if(IS_POST){ // 单图直接上传方法 // $file = request()->file('single_img'); // //如果在服务器内, 请给新建文件夹权限. 不然会出问题 // $info = $file->validate(['size'=>1567800000,'ext'=>'jpg,png,gif'])->move(ROOT_PATH . 'public' . DS . 'uploads'); // if($info){ // echo '/public/uploads/'.$info->getSaveName(); // }else{ // echo $file->getError(); // } // halt($this->param); // 单图上传处理方法 $single = ''; $file = request()->file('single_img'); if (true !== $this->validate(['image' => $file], ['image' => 'require|image'])) { //此处用json返回也可以. $this->error('请选择图像文件'); } else { //single_img放在application/admin/common.php $single = single_img(3,$file,'','','','','back'); } //多图上传处理办法 $image = []; $figure = request()->file('figure'); foreach($figure as $file){ if (true !== $this->validate(['image' => $file], ['image' => 'require|image'])) { //此处用json返回也可以. $this->error('请选择图像文件'); } else { $image[] = single_img(3,$file,'','','','','back'); } } echo $single; halt($image); } else { return $this->fetch(); } } ~~~ * 路径application/admin/common.php * 我将图片上传处理的方法封装在这里. 用于图片处理使用 * $saveName = request()->time().rand_string(6,1) . '.png'; 我在time之后加了一个随机串, 这样多图上传的时候不会冲突 ~~~ use think\Image; use think\Request; /** * [single_img description] * @param integer $type [类型, 默认为图片裁剪] * @param string $file [图片地址,上传来的图片地址.] * @param integer $width [宽度,裁剪跟缩略图使用一个] * @param integer $height [高度,裁剪跟缩略图使用一个] * @param string $watermark [水印图片地址,默认为我设置的图片] * @param string $word [文字水印的内容.] * @param string $url [图片存放路径,由于参数无法放函数.所以我用一个判断进行执行. 这个是7的问题.暂时不研究] * @return [type] [description] */ function single_img($type=1,$file='',$width=300,$height=300,$watermark='./public/common/img/logo.png',$word='www.bcahz.com',$url=''){ if($file){ if($url == ''){ $url = date("Ymd"); } // 读取图片 $image = Image::open($file); // 图片处理 switch ($type) { case 1: // 图片裁剪 $image->crop($width, $height); break; case 2: // 缩略图 $image->thumb($width, $height, Image::THUMB_CENTER); break; case 3: // 垂直翻转 $image->flip(); break; case 4: // 水平翻转 $image->flip(Image::FLIP_Y); break; case 5: // 图片旋转 $image->rotate(); break; case 6: // 图片水印 $image->water($watermark, Image::WATER_NORTHWEST, 50); break; case 7: // 文字水印 $image->text($word, VENDOR_PATH . 'topthink/think-captcha/assets/ttfs/HYQingKongTiJ.ttf', 20, '#refeee'); break; } // 保存图片(以当前时间戳) // /public/uploads/ 可以用config.get()进行设置, 这样的话, 不管oss或者本地图片路径都可以解决. $saveName = request()->time().rand_string(6,1) . '.png'; $image->save(ROOT_PATH . '/public/uploads/'.$url.'/' . $saveName); } else { return false; } return '/public/uploads/'.$url.'/' . $saveName; } ~~~