Chú ý: Chúng ta không sử dụng đồng thời hai kiểu upload như: $request->file->move, $request->file->storeAs vì nếu sử dụng đồng thời chúng sẽ báo lỗi :) fopen(): Filename cannot be empty
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ImageController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::controller(ImageController::class)->group(function () {
Route::get('image-upload', 'index');
Route::post('image-upload', 'store')->name('image.store');
});
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ImageController extends Controller {
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index() {
return view('imageUpload');
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function store(Request $request) {
$request->validate([
'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);
$imageName = time() . '.' . $request->image->extension(); // '1651654720.png'
// 🤞 Store Image in Storage Folder
$request->image->storeAs('images', $imageName);
// storage/app/images/file.png
// 🤞 Store Image in Public Folder
$request->image->move(public_path('images'), $imageName);
// public/images/file.png
/*
Write Code Here for
Store $imageName name in DATABASE from HERE
*/
return back()->with('success', 'You have successfully upload image.')->with('image', $imageName);
}
}
Ví dụ 2: Thực hành với file pdf, .docx ...
C:\xampp\htdocs\test\routes\web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\FileController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('file-upload', [FileController::class, 'index']);
Route::post('file-upload', [FileController::class, 'store'])->name('file.store');
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FileController extends Controller {
public function index() {
return view('fileUpload');
}
public function store(Request $request) {
$request->validate([
'file' => 'required|mimes:pdf,xlx,csv,docx',
]);
$fileName = time() . '.' . $request->file->extension();
// storage/app/uploads/file.pdf
// $request->file->move(public_path('uploads'), $fileName);
$request->file->storeAs('uploads', $fileName);
// public/uploads/file.docx
/*
Write Code Here for
Store $fileName name in DATABASE from HERE
*/
return back()->with('success', 'You have successfully upload file.')->with('file', $fileName);
}
}
Kết quả:
Ví dụ 3: Multiple Image Upload
C:\xampp\htdocs\test\routes\web.php
<?php
use App\Http\Controllers\ImageController;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::controller(ImageController::class)->group(function () {
Route::get('image-upload', 'index');
Route::post('image-upload', 'store')->name('image.store');
});
C:\xampp\htdocs\test\app\Models\Image.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Image extends Model {
use HasFactory;
protected $fillable = [
'name',
];
}
<?php
use App\Http\Controllers\FileController;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::controller(FileController::class)->group(function () {
Route::get('file-upload', 'index');
Route::post('file-upload', 'store')->name('file.store');
});
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFilesTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up() {
Schema::create('files', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down() {
Schema::dropIfExists('files');
}
}
C:\xampp\htdocs\test\app\Models\File.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class File extends Model {
use HasFactory;
protected $fillable = [
'name',
];
}
Laravel cung cấp cho người dùng một giải pháp để quản lý file cực kỳ tiện lợi và hữu ích - đó là File Storage. Tính năng này bạn hoàn toàn có thể dùng trên các Framework khác vì nó là một package của Frank de Jonge. Bạn có thể xem package tại đây.
Với File Storage bạn có thể thao tác với các file ở local, Rackspace Cloud Storage và cả Amazon S3.
Config
Bạn có thể config File Storage tại file config/filesystems.php.
Driver mà Laravel hỗ trợ: "local", "ftp", "sftp", "s3", "rackspace".
Local
Để sử dụng và download các file trên web, bạn cần phải chạy lệnh sau để tạo ra một symbolic link trong thư mục public của Laravel: php artisan storage:link.
Mặc định, nó sẽ link đến đường dẫn storage/app/public. Bạn có thể config đường dẫn mà nó link đến tại dòng: 'root' => storage_path('app/public').
Để thao tác với thao trên web, bạn có thể dụng: asset('storage/filename');.
Để thao tác với file local, bạn có thể dùng Storage::disk('local')->put('file.txt', 'Contents');. Vì mặc định laravel sẽ dùng local nên bạn chỉ cần sử dụng Storage::put('file.txt', 'Contents');
S3 driver
Để lưu file lên Amazon S3 bạn cần install thêm package đó là:
Amazon S3: league/flysystem-aws-s3-v3 ~1.0`
Sau khi cài xong package, bạn cần config các thông số trong config/filesystems.php:
Bạn có thể sử dụng FTP Driver mà không cần thêm package giống như ở trên. Tuy nhiên, mặc định FTP sẽ không có sẵn trong config/filesystems.php. Để sử dụng FTP bạn phải thêm vào config/filesystems.php:
Chắc hẳn bạn đã từng làm qua tính năng upload file, hay ít nhất là upload avatar cho user hoặc thumbnail cho sản phẩm chẳng hạn. Laravel hỗ trợ bạn làm điều này một cách dễ dàng thông qua Request:
Lưu ý: mặc định với cách này Laravel sẽ lưu file dưới 1 unique name. Bạn có thể lấy filename bằng cách sử dụng:
$request->file('avatar')->hashName();
Upload dưới tên khác
Như cách ở trên thì Laravel sẽ tự động thêm tên cho file mà không trùng tên với các file có sẵn. Nhưng bạn cũng có thể lưu file với một tên tùy ý bằng cách sử dụng: