最近再做一個文件上傳的功能,突然發現用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"
οnchange="$('#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!');
}