如何实现对文件的操作,实现上传,下载,展示等等功能,我们通过编写一个简单的实例来了解其中具体的内容。
文件列表的展示/文件上传/文件下载
首先我们需要创建两个文件,一个视图文件,一个控制器,来实现前后端的互通,然后我们在 storage\app\ 创建一个 uploadfiles 的文件夹,用于存储文件。
创建一个名为 filesmanagement.blade.php 的视图文件,包括基本的样式和布局,如下图:
<!doctype html>
<html lang="{
{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{
{ csrf_token() }}">
<title>Files Management</title>
<!-- Scripts -->
<script src="{
{ asset('js/app.js') }}" defer></script>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<!-- Styles -->
<link href="{
{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
<div id="app">
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
<div> This is a demo for file show, upload, download </div>
</nav>
<main class="py-4">
<div class="container">
<div class="row justify-content-center">
<div class="col-md-10">
<div class="card">
<div class="card-header">Files Management</div>
<div class="card-body">
<form>
<!-- 具体的内容稍后填充 -->
</form>
</div>
</div>
</div>
</div>
</div>
</main>
</div>
</body>
</html>
创建一个名为 FilesManagementController.php 的控制器,里面包含三个方法,如下:
<?php
namespace App\Http\Controllers\TryDemo;
use App\Http\Controllers\Controller;
class FilesManagementController extends Controller
{
public function showFiles()
{
// 页面展示文件列表
}
public function uploadFile()
{
// 上传文件时调用
}
public function downloadFile()
{
// 下载文件时调用
}
}
然后我们需要在路由配置文件里添加对控制器里具体方法的调用,如下图:
进入页面,展示所有文件列表
Route::get('/files', [App\Http\Controllers\TryDemo\FilesManagementController::class, 'showFiles']);
通过 form 表单提交上传的文件
设置此路由名为 UploadFile,之后会在视图文件里使用
Route::post('/files', [App\Http\Controllers\TryDemo\FilesManagementController::class, 'uploadFile'])
->name('UploadFile');
通过点击文件列表的超链接,在浏览器下载指定的文件,{filename} 为文件名,作为参数传入控制器
设置此路由名为 DownloadFile,之后会在视图文件里使用
Route::get('/files/{filename}', [App\Http\Controllers\TryDemo\FilesManagementController::class, 'downloadFile'])
->name('DownloadFile');
路由配置已搭建好,在继续完善实例之前,我们需要先了解一下关于文件存储的一些概念,首先在项目的根目录下有两个文件夹目录,storage和 public ,storage 和 public 目录的主要区别在于 storage 目录是用于存放应用程序生成的文件,例如日志文件、缓存文件、上传的文件等等。而 public 目录是用于存放公开访问的文件