做一个文件上传的功能,突然发现用AJAX上传时 文件路径变成了c:\fakepath\…
最后实在没办法了找到如下解决办法 暂时解决了问题
在页面添加隐藏表单,ajax提交完成时提交隐藏表单,并刷新指定的iframe实现页面不刷新完成文件提交
html
<form hidden="hidden" method="post" enctype="multipart/form-data" action="uploadFile" style="float: left;margin-left: 20px;" target="the_iframe"> {{ csrf_field() }} <input type="file" name="practiseFile" id="practiseFile" onchange="$('#practiseFileName').val($(this).val());" style="display:none"> <button id="submit" type="submit" class="btn btn-success">提交</button> </form> <iframe id="is_iframe" name="the_iframe" style="display:none;"></iframe>
然后就被经理臭骂了一顿说了iframe的各种不好
最后又找到了另一种方式,js伪造表单将文件内容传到表单里实现文件上传 ,感觉是相对于上面的方法的改进版,其他的一些方法感觉不怎么好,都是将文件路径还原的一些方法,安全性有待考证。
JS
// 点击按钮上传文件 $('#upload_file_btn').click(function() { // 检查文件是否合法 var fileFullName = $('#src_file_input').val(); console.log(fileFullName); // 构建form数据 var formData = new FormData(); formData.append('file', $('#src_file_input')[0].files[0]); // 上传文件 $.ajax({ contentType: false, cache: false, processData: false, url: "/upload", type: 'POST', data: formData, success: function(data) { console.log(data); }, error: function() { console.log('Upload file failed!'); } }); });
PHP
public function upload(Request $request) { // 获取源文件 $src_file = $request->file('file'); Log::info($src_file); // 判断文件是否有效 if (($src_file != null) && ($src_file->isValid() == true)) { // 输出源文件绝对路径 Log::info($src_file->getRealPath()); // 输出源文件扩展名 Log::info($src_file->getClientOriginalExtension()); // 存储源文件 Storage::disk('public')->put('test.xlsx', file_get_contents($src_file->getRealPath())); // 返回 return array('code' => 0, 'msg' => '文件上传成功!'); } else { // 返回 return array('code' => -1989, 'msg' => '文件上传失败!'); } // 默认返回 return array('code' => 0, 'msg' => 'success!'); }