今天聊聊在Laravel5.6 如何实现文件上传功能,以及上传文件的管理功能。主要有文件列表,上传新文件,创建文件夹,删除文件夹以及删除文件。
首先添加一个控制器,在命令行中输入php php artisan make:controller Admin/FileController
,创建一个空的FileController控制器,控制器中有下列四个方法:
我们在app/Services目录下创建一个UploadsManager服务类,用了处理上传文件以及文件目录等相关操作。实现方法
所有文件以及目录的逻辑操作放置在UploadsManager服务类内部,在控制器中对输入参数进行验证后直接调用服务类对应方法。
Laravel文件上传Storage使用的是local disk,上传文件保存在/storage/app下,并以此为根目录。如果要实现上传文件对外访问,则需要在public目录下创建一个软链接至/storage/app。我本地使用的是uploads作为上传文件跟目录url。因此需要在public目录下创建一个名为uploads的软链接。在windows中,可以使用mklink /J source_src_dir dist_src_dir
public function index(Request $request)
{
$folder = $request->get('folder','/');
$data = $this->upManager->folderInfo($folder);
return view('admin.file.index', $data);
}
<table id="posts-table" class="table table-striped table-bordered">
<thead>
<tr>
<th>name</th>
<th>type</th>
<th data-sortable="false">Actions</th>
</tr>
</thead>
<tbody>
@foreach ($items as $item)
<tr>
@if ($item['type'] == 'dir')
<td><a href="{{route('file.index',[ 'folder'=>$item['dist'] ])}}"><span class="dirname">{{ $item['name'] }}</span></a></td>
@else
<td><span class="filename">{{ $item['name'] }}</span></td>
@endif
<td>{{ $item['type'] }}</td>
<td>
<a href="{{route('file.delete',['path'=>$item['dist']])}}" class="btn btn-xs btn-info">
<i class="fa fa-edit"></i> Delete
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
php Route::namespace('Admin')->middleware(['auth'])->group
添加以下内容 Route::get('admin/file/index', 'FileController@index')->name('file.index');
Route::post('admin/file/upload', 'FileController@upload')->name('file.upload');
Route::post('admin/file/createFolder', 'FileController@createFolder')->name('file.createFolder');
Route::get('admin/file/store', 'FileController@store')->name('file.store');
Route::get('admin/file/delete','FileController@delete')->name('file.delete');
访问http://127.0.0.1:8000/admin/file/index
,可以看到文件列表已经显示正常。
image
public function createFolder(Request $request){
$this->validate($request, [
'folder' => 'required',
'name'=>'required'
]);
$res = $this->upManager->createDir($request->get('folder'),$request->get('name'));
if($res)
{
return back()->with('success','删除成功');
}
return back()->with('error','删除失败');
}
image
//上传文件
public function upload(FileUploadRequest $request){
$name = $request->get('name');
$folder = $request->get('folder');
$file = $request->file('file');
$path = $this->upManager->store($file,$folder,$name);
if($path)
{
return back()->with('success','文件上传成功');
}
return back()->with('error','文件上传失败');
}
视图文件 文件上传采用moda方式弹窗添加,在index.blade.php中添加一个moda。内容见文后代码。 moda内容中只有一个表单,点击确定提交到upload,在列表中点击upload可以看到以下内容
文件删除,通过链接中的参数path实现,判断传入路径是目录还是文件,根据不同执行不同的删除方式。
UploadsManager代码
UploadsManager
index.blade.php代码
index.blade.php
代码下载地址http://blog.static.aiaiaini.com/blog.uploadfile.zip