Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 14: Upload file trong Laravel 8

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 ở trong config/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ục storage/app/.

VD: Lưu trữ ảnh vào trong thư mục storage/app/images.

$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$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!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

6 Comments

Mong anh giải thích giúp khi nào dùng hàm move() và khi nào dùng hàm store() được không ạ?

Minh Tiến

3 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

3 năm trước

x lỗi a cho e hỏi xíu:
$storedPath = $image-

hong

3 năm trước

xin lỗi a cho e hỏi xíu, lúc gán giá trị này là nó tự động move luôn ạ, e cứ nghĩ phải chạy thêm bước gì sau khi gán mới move. e ko hiểu lắm
$storedPath = $image

hong

3 năm trước

xin lỗi a cho e hỏi xíu, lúc gán giá trị này là nó tự động move luôn ạ, e cứ nghĩ phải chạy thêm bước gì sau khi gán mới move. e ko hiểu lắm
$storedPath = $image

hong

3 năm trước

có bài giảng youtube ko a

BQ

2 năm trước

Bình luận

Captcha