Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài viết bạn đang xem là tài liệu của Laravel 5x (Giờ đã ngừng support). Bạn có thể xem tài liệu của Laravel mới nhất và đầy đủ tại đây.

Bài 19: Upload files trong Laravel

-Ở phần trước mình đã giới thiệu với mọi người về Form Request rồi, nhưng đó mới chỉ là gửi nhận dữ liệu dưới dạng text/plain vậy còn gửi và nhận dữ liệu với file thì làm thế nào?

Hôm nay chúng ta sẽ cùng tìm hiểu nốt về upload file trong Laravel

1, Chuẩn Bị.

Tạo View.

-Đầu tiên mình cần tạo ra một view form có một input file và một input submit để thực hiện upload. (name: demo_upload.blade.php)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Demo Upload File - Toidicode.com</title>
    <meta name="author" content="ThanhTai">
</head>
<body>
    <form action="{{ url('file') }}" enctype="multipart/form-data" method="POST">
        {{ csrf_field() }}
        <input type="file" name="filesTest" required="true">
        <br/>
        <input type="submit" value="upload">
    </form>
</body>
</html>

Tạo Controller.

Tiếp theo chúng ta cần tạo một controller có tên: FileController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FileController extends Controller
{
    public function index()
    {
        return view('demo_upload');
    }

    public function doUpload(Request $request)
    {
        //xử lý upload ở đây
    }
}

Tạo Route.

- Cuối cùng là tạo route để điều hướng.

Route::get('file','FileController@index');
Route::post('file','Filecontroller@doUpload');

2, Các Hàm lấy thông tin của file.

-Để cho dễ hiểu mình sẽ làm luôn VD đối với form ở trên.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FileController extends Controller
{
    public function index()
    {
        return view('file');
    }

    public function doUpload(Request $request)
    {
        //Kiểm tra file
        if ($request->hasFile('fileTest')) {
            $file = $request->filesTest;

            //Lấy Tên files
            echo 'Tên Files: ' . $file->getClientOriginalName();
            echo '<br/>';

            //Lấy Đuôi File
            echo 'Đuôi file: ' . $file->getClientOriginalExtension();
            echo '<br/>';

            //Lấy đường dẫn tạm thời của file
            echo 'Đường dẫn tạm: ' . $file->getRealPath();
            echo '<br/>';

            //Lấy kích cỡ của file đơn vị tính theo bytes
            echo 'Kích cỡ file: ' . $file->getSize();
            echo '<br/>';

            //Lấy kiểu file
            echo 'Kiểu files: ' . $file->getMimeType();
        }
    }
}

3, Upload File.

-Sau khi đã tạo được View,Controller,route phục vụ cho việc upload file rồi, giờ chúng ta sẽ tiến hành xử lý upload file.

-Để upload files với Request thì Laravel có cung cấp cho chúng ta hàm move() sử dụng với 2 thông số truyền vào:

move($Location, $filesName)

Trong đó:

  • $Location: Là thư mục chứa file upload lên Sever.
  • $filesName: Là tên mới của file.

VD: Mình sẽ upload form ở VD trên vào thư mục uploads:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FileController extends Controller
{
    public function index()
    {
        return view('file');
    }

    public function doUpload(Request $request)
    {
        $file = $request->filesTest;

        $file->move('upload', $file->getClientOriginalName());
        // hàm sẽ trả về đường dẫn mới của file trên server nếu thành công
        // còn nếu không nó sẽ raise ra exception.
    }
}

4) Lời kết.

-Phần trên mình đã giới thiệu với mọi người về uploadfiles trong Laravel. Còn cách ràn buộc loại files, dung lượng files mình sẽ trình bày tiếp ở các phần sau.

Chúc các bạn học tốt!

Đă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

13 Comments

Mình chạy theo đoạn code trong DemoUpload.blade.php của ad chẳng được. Mình nghĩ như thế này thì sửa lại được

Chỗ tạo form trong DemoUpload.blade.php nó không chạy được khi ad dùng action = {{url('file')}}
Thay vì vậy ad phải dùng chuyển tới 1 route action = "{{route('file')}}", tên 'file' phải là 1 định danh như sau:

Trong file routes.php
Route::post('file','Filecontroller@doUpload')->name('file');
Ad chỉ cần dùng 1 định danh xong rồi chuyển từ view gọi tới định danh này là đuuợc

* Góp ý:
1. Người dùng muốn comment mà phải nhập tùm lum kể cả mã captcha nữa thì bỏ hộ cái

hacker

7 năm trước

Thứ nhất là source vẫn chạy bình thường mà bạn, hoặc bạn cũng có thể sử dụng route name để tăng tính bảo trì cho code.
Thứ 2 là do bạn nhập linh tinh, nên nó mới không được thôi, tên toàn hacker thế này mình mà không để captcha hacker như bạn lại hack thì sao.

Vũ Thanh Tài

7 năm trước

Hahha

Namdaik

6 năm trước

  • ​​​​​​​

l

6 năm trước

anh nói chuẩn

Vinh

4 năm trước

Anh nói quá chuẩn

Vinh

4 năm trước

Cảm ơn ad rất nhiều :))

Lạc

6 năm trước

bạn có thể hướng dẫn multiple file upload  được không

Trần Ngọc Tú

6 năm trước

sao minh get file lúc nào cũng ra null vậy

$request->hasFile('stl') 

=> []

An

6 năm trước

mình nghĩ là nên có  thêm example hoặc hình demo để dễ hình dung hơn. cảm ơn ad !

N

6 năm trước

<input type="file" name="filesTest" required="true">

$request->hasFile('fileTest')

sai nhé :D

NOT

6 năm trước

cho e hỏi là e đã thử tải file docx thì ko hề xảy ra lỗi nhưng tải file doc thì chương trình không đọc được và báo lỗi

Bùi Ngọc Khánh

3 năm trước

Chào Bùi Ngọc Khánh,

Bạn cho mình xem log lỗi với

Vũ Thanh Tài

3 năm trước

Bình luận

Captcha