filepond是一個比較受歡迎的前端上傳檔案用的JS外掛。它主要有兩個應用,第一個是類似於AJAX上傳檔案一樣,顯示上傳進度並進行多檔案的拖拽上傳,第二個是可以在前端對圖片進行長寬和大小的調整,直接用於上傳頭像的場合,其他的應用大家可以谷歌一下它的官網。我們下面就來談談如何把filepond整合到laravel專案裡面的。
用filepond的時候當然還是有兩種選擇,直接包含CDN到頭部。
第二種是NPM安裝,我比較傾向於第二種。
npm install filepond
先是載入css到app.scss裡面。我用的app.scss, Laravel8預設已經沒有了,但是我想很多人比較喜歡用sass,順便說說我是怎麼用的。就是在webpack.mix.js裡面在最後加了一句:
.sass('resources/sass/app.scss', 'public/css');
包含filepond.min.css到app.scss
@import '~filepond/dist/filepond.min.css';
如果在app.css裡面載入估計不是這個格式。
然後在resources/js/bootstrap.js裡面:
import * as FilePond from 'filepond';
window.FilePond = FilePond;
然後執行命令:
npm run dev
然後在你所需要的blade裡面插入HTML,通常是這樣的:
<input type="file" name="file"/>
初始化filepond:
document.addEventListener('DOMContentLoaded', () => { FilePond.create(document.querySelector('input[name="file"]'));
FilePond.setOptions({
server: {
url: '/upload',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
}
}
});
});
如過沒有讓DOM準備好會不生效,因為我們的app.js引入的時候是defer的模式。所以一定要有這一句。
這樣我們到前端看看是否已經生效,如果生效了是這樣的:
這樣我們強調一下csrf令牌必須要傳入,否則就會出現代號為419的錯誤。
下面來看看laravel是如何處理的:
首先要加一個路由,做一個控制器:
web.php:
use App\Http\Controllers\UploadController;
Route::post('/upload', [UploadController::class, 'store']);
filepond要求返回一個字串,否則就視為不成功:
uploadcontroller.php
public function store(Request $request){
if($request->hasFile('file')){
$path = $request->file('file')->store('file');
return $path;
}
return '';
}
大家可以嘗試下是否可以上傳成功。
至於如何再繼續處理檔案和名稱之類的,再繼續進行研究。
本作品採用《CC 協議》,轉載必須註明作者和本文連結