PHP Filesystem上传文件的使用
Filesystem 函数允许您访问和操作文件系统。Filesystem 函数是 PHP 核心的组成部分,无需安装即可使用这些函数。下面是使用例子:
前端部分,这里我使用ajax上传文件的
<form id="contact-form" method="post"> <div class="row"> <div class="col-md-12"> <input type="text" name="title" id="res_title" placeholder="標題"> </div> <div class="col-md-6"> <input type="text" name="name" id="res_name" placeholder="姓名"> </div> <div class="col-md-6"> <input type="text" name="phone" id="res_phone" placeholder="電話"> </div> <div class="col-md-12"> <textarea name="content" cols="30" rows="10" placeholder="留言內容"></textarea> <input type="hidden" name="cate_id" value="{$cate.id}"> <input type="file" id="file" name="file" class="button-default"/> <button type="button" class="button-default res_button">提交</button> </div> </div> </form> <script> $.fn.serializeFiles = function() { var form = $(this),formData = new FormData();//通过FormData构造函数创建一个空对象 var formParams = form.serializeArray();//带有name和value的json,比如{name: "username1", value: "a"} //通过append()方法来追加数据,type="file" $.each(form.find('input[type="file"]'), function(i, tag) { $.each($(tag)[0].files, function(i, file) { formData.append(tag.name, file); }); }); //通过append()方法来追加数据,type="text" $.each(formParams, function(i, val) { formData.append(val.name, val.value); }); return formData; }; //提交留言 $(".res_button").click(function () { var name = $("#res_name").val(); var phone = $("#res_phone").val(); var title = $("#res_title").val(); if (!title) { layer.msg("標題,不能為空!"); return; } if (!name) { layer.msg("名稱,不能為空!"); return; } if (!phone) { layer.msg("電話,不能為空!"); return; } var formData= $("#contact-form").serializeFiles(); $.ajax({ url:"{:url('index/pay_upload')}", processData : false, // 使数据不做处理 contentType : false, // 不要设置Content-Type请求头 type:"POST", data:formData, success:function (res) { if (res.code == 200) { layer.msg("Success!!",{icon:1,time:2000,end:function(){ window.location.reload(); }}) } } }) }) </script>
app/common.php
function uploadFile($file, $dir){ // 使用验证器验证上传的文件 // validate(['file' => [ // // 限制文件大小(单位b),这里限制为4M // 'fileSize' => 4 * 1024 * 1024, // // 限制文件后缀,多个后缀以英文逗号分割 // 'fileExt' => 'gif,jpg,png' // // 更多规则请看“上传验证”的规则,文档地址https://www.kancloud.cn/manual/thinkphp6_0/1037629#_444 // ]])->check(['file' => $file]); // 文件名规则,默认是当前时间。可以使用哈希算法,如:md5,sha1等。还可以传入匿名函数 $rule = 'date()'; // 将文件保存public磁盘,文件名为$rule指定的规则。然后将文件路径赋值给$path $path = \think\facade\Filesystem::disk('public')->putFile($dir, $file); // 拼接URL路径 $url = \think\facade\Filesystem::getDiskConfig('public', 'url') . '/' . str_replace('\\', '/', $path); $save_path = \think\facade\Filesystem::getDiskConfig('public', 'root') . '/' . str_replace('\\', '/', $path); $url_arr = explode('/', $url ); $info = [ 'save_path' => str_replace('\\', '/', $save_path), // URL路径 'url' => str_replace('\\', '/', $url), // 文件大小(字节) 'size' => $file->getSize(), // 文件名 'save_name' => $url_arr[count($url_arr)-1], 'original_name' => $file->getOriginalName(), // 文件MINE:image/jpeg 'mine' => $file->getMime(), //文件扩展名 'extension' => $file->getOriginalExtension(), ]; return $info; }
控制器:
//付款上载 public function pay_upload(){ $param = $this->request->param(); if ($_FILES) { // 上传文件错误或者文件验证不通过时,都会抛出异常,所以要使用try来捕捉异常 try { // 获取上传的文件,如果有上传错误,会抛出异常 $file = \think\facade\Request::file('file'); // 如果上传的文件为null,手动抛出一个异常,统一处理异常 if (null === $file) { // 异常代码使用UPLOAD_ERR_NO_FILE常量,方便需要进一步处理异常时使用 throw new \Exception('请上传文件', UPLOAD_ERR_NO_FILE); } $fileinfo = uploadFile($file, 'payUpload'); if ($fileinfo) { $param['file_name'] = $fileinfo['original_name']; $param['save_name'] = $fileinfo['save_name']; $param['file_ext'] = $fileinfo['extension']; $param['file_mime_type'] = $fileinfo['mine']; $param['file_size'] = $fileinfo['size']; $param['url'] = $fileinfo['url']; $param['save_path'] = $fileinfo['save_path']; } $param['create_time'] = time(); $res = Payupload::insert($param); if ($res) { return json(['code' => 200]); } else{ return json(['code' => 0]); } } catch (\Exception $e) { // 如果上传时有异常,会执行这里的代码,可以在这里处理异常 return json([ 'code' => 1, 'msg' => $e->getMessage(), ]); } } else{ return json(['code' => 0]); } }
全局设置保存文件的路劲: