Làm thứ làm cho Laravel Request của bạn thú vị hơn

PHP Laravel 5 Upload images cơ bản

PHP Laravel 5 Upload images cơ bản

Nói về chức năng up hình, đây là chức năng ko thể thiếu dành cho website, và Laravel cũng hỗ trợ đầy đủ chúng ta về việc đó.

Nó là một phần của Request, nhưng mình tách ra làm 1 bài riêng để dễ phân biệt hơn 😀

Bạn nào ko nhớ Request thì có thể xem lại tại: http://sethphat.com/sp-283/php-laravel-request-post-get-co-ban

1/ PHP Laravel 5 Upload images – Lưu ý cơ bản

Ở đây mình có các lưu ý như sau:

2/ PHP Laravel 5 Upload images – Tạo form để upload images

Mình sẽ sử dụng form như sau:

<!-- xuat loi neu co -->
@if (count($errors) > 0)
     <div class="alert alert-danger">
         <ul>
         @foreach ($errors->all() as $error)
             <li>{{ $error }}</li>
         @endforeach
         </ul>
     </div>
@endif

{!! Form::open(['url' => '/upload', 'files' => true]) !!} 
     <!-- File upload chap nhap type Image -->
     {!! Form::file('image', ['accept' => 'image/*']) !!} <br>
     {!! Form::submit('Upload') !!}
{!! Form::close() !!}

Đây là form cơ bản, bạn có thể dùng form riêng tùy ý các bạn 😀

3/ PHP Laravel 5 Upload images – Xử lý upload

Đây là phần quan trọng nhất, và phần này ta sẽ thực thi tại Controller.

Về Validator

Mình có gợi ý như sau:

  • Vì trên kia đã accept image, nhưng ko có nghĩa là an toàn bởi vì hiện tại các browser chỉ cần F12 là bỏ dc dòng đó. Chúng ta cần phải check 1 lần nữa.
  • Không chỉ check file type, chúng ta còn fải check giới hạn upload file size là bao nhiêu.

Vậy nên, mình sẽ có rules như sau:

$rules = [
	'image'		=> 'image|max:1024'
];

$posts = [
	'image'		=> $rq->file('image')
];

Ở đây mình sẽ check lại file type “image”, và dùng “max” để kiểm tra coi file size có lố giới hạn ko. Ở đây nếu file quá 1024KB sẽ bị từ chối.

Sau đó các bạn cứ Validator make bình thường nhé.

Về xử lý upload

Chúng ta sẽ làm các công việc như sau:

  • Kiểm tra xem file đã thực sự upload lên chưa.
  • Move file sang thư mục upload.

Đây là các xử lý:

// Ko có lỗi, kiểm tra nếu file đã dc upload
		if ($rq->file('image')->isValid()) {
			// File này có thực, bắt đầu đổi tên và move
			$fileExtension = $rq->file('image')->getClientOriginalExtension(); // Lấy . của file
			
			// Filename cực shock để khỏi bị trùng
			$fileName = time() . "_" . rand(0,9999999) . "_" . md5(rand(0,9999999)) . "." . $fileExtension;
						
			// Thư mục upload
			$uploadPath = public_path('/upload'); // Thư mục upload
			
			// Bắt đầu chuyển file vào thư mục
			$rq->file('image')->move($uploadPath, $fileName);
			
			// Thành công, show thành công
			return redirect()->back()->with('success', 'Upload files thành công!');
		}
		else {
			// Lỗi file
			return redirect()->back()->with('error', 'Upload files thất bại!');
		}

Để kiểm tra file thì ta cứ việc sử dụng hàm isValid(), và hàm move(thư mục, tên) để chuyển file sau khi đã upload.

Mọi thứ cực kỳ đơn giản với vài hàm fải ko nào? 😀

Bây giờ nếu bạn chạy, bạn đã có thể chạy thử và xem file của mình đã có trong thư mục upload chưa 😀

Full hàm tại Controller:

function xuLyUpload(Request $rq) {
	$rules = [ 'image' => 'image|max:1024' ]; 
	$posts = [ 'image' => $rq->file('image') ];
	
	// Validator để kiểm tra
	$valid = Validator::make($posts, $rules);
	
	// Kiểm tra nếu có lỗi
	if ($valid->fails()) {
		// Có lỗi, redirect trở lại
		return redirect()->back()->withErrors($valid)->withInput();
	}
	else {
		// Ko có lỗi, kiểm tra nếu file đã dc upload
		if ($rq->file('image')->isValid()) {
			// File này có thực, bắt đầu đổi tên và move
			$fileExtension = $rq->file('image')->getClientOriginalExtension(); // Lấy . của file
			
			// Filename cực shock để khỏi bị trùng
			$fileName = time() . "_" . rand(0,9999999) . "_" . md5(rand(0,9999999)) . "." . $fileExtension;
						
			// Thư mục upload
			$uploadPath = public_path('/upload'); // Thư mục upload
			
			// Bắt đầu chuyển file vào thư mục
			$rq->file('image')->move($uploadPath, $fileName);
			
			// Thành công, show thành công
			return redirect()->back()->with('success', 'Upload files thành công!');
		}
		else {
			// Lỗi file
			return redirect()->back()->with('error', 'Upload files thất bại!');
		}
	}
}

 

4/ PHP Laravel 5 Upload images – Lời kết

Với Laravel 5, đã hỗ trợ cho chúng ta đầy đủ Upload từ các file bình thường cho tới file Image, các bạn chỉ việc làm tương tự thôi 😀

Và khi đã upload 1 thứ gì đó lên server, ta cần phải đảm bảo rằng:

  • Loại file upload lên phải là tuyệt đối.
  • Không chủ quan vào accept của HTML.
  • Luôn luôn kiểm tra file lại lần nữa và phải có giới hạn file size.

Mấy thứ này không chỉ giúp bạn tránh được lãng phí tài nguyên mà còn giúp bạn tránh được sự nguy hiểm của hacker.

Hẹn các bạn bài sau: Phân trang(Pagination) với Laravel 5.

Cám ơn các bạn đã quan tâm theo dõi 😀

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Bình luận qua Facebook