Sau khi đã giới thiệu với mọi người về request trong Laravel rồi. Bài này mình sẽ giới thiệu với mọi người upload file trong Laravel.
1. Store Upload file.
Để lưu trữ các file đã được upload lên trên request các bạn sử dụng phương thức store
với cú pháp như sau:
$request->file('photo')->store($path, $diskType);
Trong đó:
$path
là path mà bạn muốn lưu trữ file.$diskType
là loại disk mà bạn muốn lưu trữ. Các thông tin này các bạn có thể config ở trongconfig/filesystems.php
. Mặc định thì laravel sẽ sử dụng disk làlocal
, loại disk này sẽ lưu trữ thông tin vào trong thư mụcstorage/app/
.
VD: Lưu trữ ảnh vào trong thư mục storage/app/image
s.
$path = $request->file('photo')->store('images');
// hoặc
$path = $request->file('photo')->store('images', 'local');
Khi các bạn sử dụng phương thức store
để lưu trữ file, thì tên của file khi được lưu trữ sẽ là một chuỗi ngẫu nhiên 40 ký tự được sinh ra bởi Str::random(40)
trong Collection.
Nếu bạn muốn đặt tên file theo cách của bạn thì có thể sử dụng phương thức storeAs
với cú pháp sau:
$request->file('photo')->storeAs($path, $fileName, $diskType);
Trong đó: $path
và $diskType
tương tự như đối với store. $fileName
là tên của file mà các bạn muốn lưu trữ.
VD:
$request->file('image')->storeAs('images', 'avatar.jpg', 'local');
Ngoài ra bạn cũng có thể sử dụng phương thức move
để lưu trữ file. Nhưng đối với phương thức này thì root folder sẽ được tính từ public/
.
VD: Lưu trữ image vào thư mục public/images
$request->file('image')->storeAs('images', 'avatar.jpg', 'local');
2. Ví dụ upload file trong Laravel.
Đầu tiên mình sẽ tạo ra hai route để hiển thị ra form upload file và xử lý việc upload file.
- routes/web.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('form');
});
Route::post('upload', function (Request $request) {
// logic xử lý upload file.
})->name('upload.handle');
Tiếp đó mình sẽ tạo một view form.blade.php
chứa HTML form để upload file.
- resources/views/form.blade.php
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="{{ route('upload.handle') }}" method="POST" enctype="multipart/form-data">
@csrf
<input type="file" name="image">
<input type="submit" value="Submit">
</form>
</body>
</html>
Tiếp theo đó, mình sẽ quay lại route để viết thêm logic để xử lí upload file.
- routes/web.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('form');
});
Route::post('upload', function (Request $request) {
// Kiểm tra xem người dùng có upload file nên không
if (!$request->hasFile('image')) {
// Nếu không thì in ra thông báo
return "Mời chọn file cần upload";
}
// Nếu có thì thục hiện lưu trữ file vào public/images
$image = $request->file('image');
$storedPath = $image->move('images', $image->getClientOriginalName());
return "Lưu trữ thành công";
})->name('upload.handle');
Thế là hoàn thành việc upload file trong Laravel.
3. Lời kết.
Ở phần ví dụ trên mình chỉ demo upload file một cách đơn giản nhất trong Laravel thôi, trên thực tế thì các bạn sẽ cần phải validate dung lượng file upload lên, loại file,... để cho ứng dụng của bạn an toàn nhất có thể. Về phần validate mình sẽ trình bày về nó trong các bài sau.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
Minh Tiến
4 năm trước
Cho e hỏi xíu, a chỉ demo code hay có chạy thử ko ạ. Nếu e đặt url ở route là upload như a, nó sẽ bị trùng với tên file trong sever và báo lỗi not found.
quyen
4 năm trước
hong
4 năm trước
hong
4 năm trước
hong
4 năm trước
BQ
3 năm trước