如何在 Laravel 中测试文件上传?
在本教程中,我们将了解到如何使用 Laravel 测试文件上传。我们将创建一个非常简单的表单来上传文件。此外,我们还将使用 Laravel 测试文件上传。
创建一个新视图
让我们先创建一个简单的视图。在 resources/views
目录中创建一个名为 upload.blade.php
文件。将以下内容复制至 upload
视图中。
<!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="/upload" method="post" enctype="multipart/form-data">
{{ csrf_field() }}
<input type="file" accept="image/*" name="file">
<button type="submit">Submit</button>
</form>
</body>
</html>
路由
在 routes/web.php
文件中添加以下两个路由。
Route::get('/upload', 'UploadController@index');
Route::post('/upload', 'UploadController@store');
一个路由将用于显示表单,另外一个路由将用于处理上传。
应用程序逻辑
运行以下命令创建一个上传控制器。
php artisan make:controller UploadController
迁移文件
让我们为上传文件创建一个新的迁移文件和模型。运行以下命令来创建 Upload 模型和迁移文件。
php artisan make:model Upload -m
打开 database/migrations
目录下的 create_uploads_table.php
文件,将 up
方法替换为下面所写的内容。
Schema::create('uploads', function (Blueprint $table) {
$table->increments('id');
$table->string('file');
$table->timestamps();
});
我们将已上传文件的路径保存在 file
列中。
Upload 模型
打开 Upload 模型,添加以下内容以避免出现大规模赋值异常。
protected $guarded = [];
在实际的应用程序中,你更愿意使用 $fillable
属性。
Upload 控制器
现在,将以下内容复制至 UploadController.php
文件中。
<?php
namespace App\Http\Controllers;
use App\Upload;
use Illuminate\Http\Request;
class UploadController extends Controller
{
public function index()
{
return view('upload');
}
public function store(Request $request)
{
Upload::create([
'file' => $request->file('file')->store('file', 'public')
]);
if ($request->wantsJson()) {
return response([], 204);
}
return back();
}
}
在 index 方法中,我们简单的将视图返回。在 store 方法中,我们将上传文件的名称存储至数据库中。$request->file('file')->store('file', 'public')
返回哈希文件名,同时将文件存储至磁盘上。
我们的后台逻辑已经完成。
测试文件上传
让我们言归正传:测试文件上传。运行以下命令来创建一个新的功能测试。
php artisan make:test UploadTest
在 tests/Feature
目录中打开 UploadTest.php
文件,将文件中的内容替换为以下内容。
<?php
namespace Tests\Feature;
use App\Upload;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
class UploadTest extends TestCase
{
/** @test */
function upload_file_test()
{
Storage::fake('public');
$this->json('post', '/upload', [
'file' => $file = UploadedFile::fake()->image('random.jpg')
]);
$this->assertEquals('file/' . $file->hashName(), Upload::latest()->first()->file);
Storage::disk('public')->assertExists('file/' . $file->hashName());
}
}
在 upload_file_test
中,首先我们简单的调用 Storage::fake('public');
,它将用一个名为 public
的本地测试磁盘替换为给定的磁盘。
在下一行中,我们将一个 post 请求推送至 /upload
路由,这将调用 Upload 控制器中的 store 方法。我们使用 UploadedFile::fake()->image('random.jpg')
创建一个名为 random.jpg
的伪图片。Laravel 实际上创建一个新的黑色图片并将其保存在 PHP temp 目录下。如果需要,你还可以将宽度和高度传给 image 方法,默认为 10 * 10 。如果设置了最小宽度和高度的验证,则可以传递这些参数。
接下来,我们检查在数据库中是否存在该文件名称。它只是在数据库中查找最新记录,并检查其文件属性是否等于文件的哈希名称。
最后,我们检查在第一步中通过调用 fake
方法,创建在公共磁盘上的文件是否存在。
这就是用 Laravel 测试上传文件所需的全部内容,希望它能对你的项目有所帮助。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。