一、修改上传路径
找到根目录/config/filesystem.php,修改root的值如下:
'local' => [ // 'root' => app()->getRuntimePath() . 'storage', 'root' => app()->getRootPath() . 'public', ], 'public' => [ // 磁盘路径 // 'root' => app()->getRootPath() . 'public/storage', 'root' => app()->getRootPath() . 'public', ],二、上传的html
<form method="post"> <input type="hidden" name="id" value="{$siteInfo.id}" id="id"> <div> <label for="username">名称</label> <input id="sitename" value="{$siteInfo.sitename}" name="sitename" type="text"> </div> <div> <label for="username">banner1</label> <input id="banner1" name="banner1" type="file"> </div> <div> <label for="username">banner1</label> <input id="banner2" name="banner2" type="file"> </div> <div> <button type="button" onclick="onSubmit()">保存</button> </div> </form>三、上传的jQuery ajax:
function onSubmit() { var formData = new FormData($('#form')[0]); //获取表单数据 $.ajax({ type: 'post', url: "{:url('article/edit')}", data: formData, cache: false, contentType: false, processData: false, success: (res) => { if (res.code === 200) { location.href = "{:url('article/index')}" } alert(res.msg) } }) }或者
function onSubmit() { var sitename = $('#sitename').val(); var id = $('#id').val(); var formData = new FormData(); formData.append('sitename', sitename); formData.append('en_sitename', en_sitename); formData.append('id', id); formData.append("banner1",$("#banner1")[0].files[0]); formData.append("banner2",$("#banner2")[0].files[0]); $.ajax({ url: "{:url('article/edit')}", method: 'post', data: formData, cache: false, contentType: false, processData: false, success: (res) => { if (res.code === 200) { location.href = "{:url('article/index')}" } alert(res.msg) } }) }ajax的相关参数解释:
cache
cache设为false可以禁止浏览器对该URL(以及对应的HTTP方法)的缓存。 jQuery通过为URL添加一个冗余参数来实现。
该方法只对GET和HEAD起作用,然而IE8会缓存之前的GET结果来响应POST请求。 这里设置cache: false是为了兼容IE8。
contentType
jQuery中content-type默认值为application/x-www-form-urlencoded, 因此传给data参数的对象会默认被转换为query string(见HTTP 表单编码 enctype)。
我们不需要jQuery做这个转换,否则会破坏掉multipart/form-data的编码格式。 因此设置contentType: false来禁止jQuery的转换操作。
processData
jQuery会将data对象转换为字符串来发送HTTP请求,默认情况下会用 application/x-www-form-urlencoded编码来进行转换。 我们设置contentType: false后该转换会失败,因此设置processData: false来禁止该转换过程。
我们给的data就是已经用FormData编码好的数据,不需要jQuery进行字符串转换。
四、thinkphp代码
public function edit() { $id = input('id',0,'intval'); $data = $this->_handleInput(); $data['id'] = $id; if(isset($_FILES['banner1'])){ if($_FILES['banner1']['tmp_name']){ $data['banner1'] = $this->upload('banner1'); } } if(isset($_FILES['banner2'])){ if($_FILES['banner2']['tmp_name']){ $data['banner2'] = $this->upload('banner2'); } } $res = Db::table('site_info')->save($data); if($res>=0){ return json(['code'=>200,'msg'=>'修改成功!']); }else{ return json(['code'=>301,'msg'=>'修改失败!']); } } private function _handleInput(){ $data = array(); $data['sitename'] = input('sitename','','trim'); $data['en_sitename'] = input('en_sitename','','trim'); return $data; } public function upload($tempName){ $file = request()->file($tempName); //上传并获取地址 $savename = \think\facade\Filesystem::putFile( 'uploads', $file); //将斜杠替换 $savename = str_replace('\\', '/', $savename); return $savename; }