教程源自:Laravel学院

这一节 咱来说说上传文件的功能实现,我们会把上传的文件保存到项目本地,不仅上传 还有删除和预览功能。


1 配置

我们先从配置开始做起,先修改我们自己创建的 blog.php

  1. <?php
  2. return [
  3. 'title' => "Larger K's Blog",
  4. 'posts_per_page' => 10,
  5. 'uploads' => [
  6. 'storage' => 'local', // 储存处
  7. 'webpath' => '/uploads' // 储存路径
  8. ],
  9. ];

然后编辑 config/filesystems.php

  1. 'disks' => [
  2.  
  3. 'local' => [
  4. 'driver' => 'local',
  5. // 'root' => storage_path('app'),
  6. 'root' => public_path('uploads'),
  7. ],

2 创建文件服务类

我们需要创建一个Manager来封装需要用到的功能。

2.1 引入dflydev

difydev包是主要用于分别MIME类型的,我们需要根据不同的文件类型进行不同的操作,所以需要使用到它,如果你记不住它的名字可以到Packagist 中搜索 MIME

然后我们使用 composer 引入它:

  1. composer require "dflydev/apache-mime-types"

2.2 创建UploadsManager

我们在 app/Service 目录下创建:

  1. <?php
  2. namespace App\Services;
  3.  
  4. use Carbon\Carbon;
  5. use Dflydev\ApacheMimeTypes\PhpRepository;
  6. use Illuminate\Support\Facades\Storage;
  7. use phpDocumentor\Reflection\DocBlock\Tags\Return_;
  8.  
  9. class UploadsManager {
  10. protected $disk;
  11. protected $mimeDelect;
  12.  
  13. /**
  14. * UploadsServices constructor.
  15. * @param $mimeDelect
  16. */
  17. public function __construct(PhpRepository $mimeDelect)
  18. {
  19. $this->mimeDelect = $mimeDelect;
  20. $this->disk = Storage::disk(config('blag.uploads.storage'));
  21. }
  22.  
  23. /**
  24. * 返回目录详情
  25. *
  26. * @param $folder
  27. * @return array [
  28. * 'folder', 文件夹的路径
  29. * 'folderName', 文件夹名称
  30. * 'breadcrumbs', 文件夹被分割后的数组
  31. * 'subfolders', 此文件夹下的所有子文件夹
  32. * 'files' 此文件夹下的所有文件详情
  33. * ]
  34. */
  35. public function folderInfo($folder)
  36. {
  37. // 处理$folder
  38. $folder = $this->cleanFolder($folder);
  39. // 获得路径数组
  40. $breadcrumbs = $this->breadcrumbs($folder);
  41. // 取出最后一段
  42. $slice = array_slice($breadcrumbs, -1);
  43. // 获得当前数组指针下的value
  44. $folderName = current($slice);
  45. // 获取0到倒数第二个的片段
  46. $breadcrumbs = array_slice($breadcrumbs, 0, -1);
  47. // 获得子目录
  48. $subfolders = [];
  49. foreach (array_unique($this->disk->directories($folder)) as $subfolder) {
  50. $subfolders["/$subfolder"] = basename($subfolder);
  51. }
  52. // 获得文件
  53. $files = [];
  54. foreach ($this->disk->files($folder) as $path) {
  55. $files[] = $this->fileDetails($path);
  56. }
  57.  
  58. return compact(
  59. 'folder',
  60. 'folderName',
  61. 'breadcrumbs',
  62. 'subfolders',
  63. 'files'
  64. );
  65. }
  66.  
  67. /**
  68. * 去除路径中首尾的..和/
  69. *
  70. * @param string $folder
  71. * @return string
  72. * 例子:传入 ../public/images/home/01/ 返回 "/public/images/home/01"
  73. */
  74. protected function cleanFolder($folder)
  75. {
  76. return '/' . trim(str_replace('..', '', $folder), '/');
  77. }
  78.  
  79. /**
  80. * 返回路径数组
  81. *
  82. * @param $folder
  83. * @return array when $folder is empty[
  84. * '/' => 'root'
  85. * ] when folder is not empty[
  86. * "/" => "root"
  87. * "/public" => "public"
  88. * "/images" => "images"
  89. * "/home" => "home"
  90. * ]
  91. */
  92. protected function breadcrumbs($folder)
  93. {
  94. // 去除首尾的 /
  95. $folder = trim($folder, '/');
  96. $crumbs = ['/' => 'root'];
  97. if (empty($folder)){
  98. return $crumbs;
  99. }
  100. // 分割路径
  101. $folders = explode('/', $folder);
  102. // build
  103. $build = '';
  104. foreach ($folders as $folder) {
  105. $build = '/'.$folder;
  106. $crumbs[$build] = $folder;
  107. }
  108. return $crumbs;
  109. }
  110.  
  111. /**
  112. * 返回文件的详情信息
  113. *
  114. * @param string $path
  115. * @return array
  116. */
  117. protected function fileDetails($path)
  118. {
  119. $path = '/' . trim($path, '/');
  120. return [
  121. 'name' => basename($path),
  122. 'fullpath' => $path,
  123. 'webPath' => $this->fileWebpath($path),
  124. 'mimeType' => $this->fileMimeType($path),
  125. 'size' => $this->fileSize($path),
  126. 'modified' => $this->fileModified($path),
  127. ];
  128. }
  129.  
  130. /**
  131. * 返回文件的Web路径
  132. *
  133. * @param $path
  134. * @return string
  135. */
  136. protected function fileWebpath($path)
  137. {
  138. $path = rtrim(config('blog.uploads.webpath'), '/') . '/' . ltrim($path, '/');
  139. return url($path);
  140. }
  141.  
  142. /**
  143. * 返回文件的MIME类型
  144. *
  145. * @param $path
  146. * @return mixed|null|string
  147. */
  148. protected function fileMimeType($path)
  149. {
  150. return $this->mimeDelect->findType(
  151. pathinfo(
  152. $path, PATHINFO_EXTENSION
  153. )
  154. );
  155. }
  156.  
  157. /**
  158. * 返回文件的大小
  159. *
  160. * @param $path
  161. * @return mixed
  162. */
  163. protected function fileSize($path)
  164. {
  165. return $this->disk->size($path);
  166. }
  167.  
  168. /**
  169. * 返回最后一次被修改的时间
  170. *
  171. * @param $path
  172. * @return static
  173. */
  174. protected function fileModified($path)
  175. {
  176. return Carbon::createFromTimestamp(
  177. $this->disk->lastModified($path)
  178. );
  179. }
  180. }

注释写的很尽力了,敲一遍你就懂了,上面的代码主要是folderInfo这个方法 它返回我们需要用到的一些数据

2.3 创建帮助函数

其实把Manager创建好后就可以展示视图了,但是方便我们使用先来创建两个帮助函数,在app目录下创建一个helper.php

  1. <?php
  2. /**
  3. * 返回可读性更好的文件大小
  4. *
  5. * @param $bytes
  6. * @param int $decimals
  7. * @return string
  8. */
  9. function human_filesize($bytes, $decimals = 2){
  10. $size = ['B', 'kB', 'MB', 'GB', 'TB', 'PB'];
  11. $factor = floor((strlen($bytes) - 1) / 3);
  12.  
  13. return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) .@$size[$factor];
  14. }
  15.  
  16. /**
  17. * 判断mime type是否是图片类型
  18. *
  19. * @param $mime_type
  20. * @return bool
  21. */
  22. function is_image($mime_type){
  23. return starts_with($mime_type, 'image/');
  24. }

现在有个问题,我们如何在不import的情况下使用到帮助函数呢 它并不是一个类 没有命名空间,解决这个方法就要修改下composer.json文件让它自动加载文件:

  1. "autoload": {
  2. "classmap": [
  3. "database"
  4. ],
  5. "psr-4": {
  6. "App\\": "app/"
  7. },
  8. "files": [
  9. "app/helper.php"
  10. ]

最后执行以下命令:

  1. composer dumpauto

3 展示文件视图

3.1 首先编辑UploadController的index方法:

  1. class UploadController extends Controller
  2. {
  3. protected $manager;
  4.  
  5. /**
  6. * UploadController constructor.
  7. * @param UploadsManager $manager
  8. */
  9. public function __construct(UploadsManager $manager)
  10. {
  11. $this->manager = $manager;
  12. }
  13.  
  14. public function index(Request $request)
  15. {
  16. // 取到目录的详情
  17. $data = $this->manager->folderInfo($request->get('folder'));
  18. return view('admin.upload.index', $data);
  19. }
  20. }

创建一个 /admin/upload/index.blade.php

  1. @extends('admin.layout')
  2.  
  3. @section('content')
  4. <div class="container-fluid">
  5.  
  6. {{-- 顶部工具栏 --}}
  7. <div class="row page-title-row">
  8. <div class="col-md-6">
  9. <h3 class="pull-left">Uploads </h3>
  10. <div class="pull-left">
  11. <ul class="breadcrumb">
  12. @foreach ($breadcrumbs as $path => $disp)
  13. <li><a href="/admin/upload?folder={{ $path }}">{{ $disp }}</a></li>
  14. @endforeach
  15. <li class="active">{{ $folderName }}</li>
  16. </ul>
  17. </div>
  18. </div>
  19. <div class="col-md-6 text-right">
  20. <button type="button" class="btn btn-success btn-md" data-toggle="modal" data-target="#modal-folder-create">
  21. <i class="fa fa-plus-circle"></i> New Folder
  22. </button>
  23. <button type="button" class="btn btn-primary btn-md" data-toggle="modal" data-target="#modal-file-upload">
  24. <i class="fa fa-upload"></i> Upload
  25. </button>
  26. </div>
  27. </div>
  28.  
  29. <div class="row">
  30. <div class="col-sm-12">
  31.  
  32. @include('admin.partials.error')
  33. @include('admin.partials.success')
  34.  
  35. <table id="uploads-table" class="table table-striped table-bordered">
  36. <thead>
  37. <tr>
  38. <th>Name</th>
  39. <th>Type</th>
  40. <th>Date</th>
  41. <th>Size</th>
  42. <th data-sortable="false">Actions</th>
  43. </tr>
  44. </thead>
  45. <tbody>
  46.  
  47. {{-- 子目录 --}}
  48. @foreach ($subfolders as $path => $name)
  49. <tr>
  50. <td>
  51. <a href="/admin/upload?folder={{ $path }}">
  52. <i class="fa fa-folder fa-lg fa-fw"></i>
  53. {{ $name }}
  54. </a>
  55. </td>
  56. <td>Folder</td>
  57. <td>-</td>
  58. <td>-</td>
  59. <td>
  60. <button type="button" class="btn btn-xs btn-danger" onclick="delete_folder('{{ $name }}')">
  61. <i class="fa fa-times-circle fa-lg"></i>
  62. Delete
  63. </button>
  64. </td>
  65. </tr>
  66. @endforeach
  67.  
  68. {{-- 所有文件 --}}
  69. @foreach ($files as $file)
  70. <tr>
  71. <td>
  72. <a href="{{ $file['webPath'] }}">
  73. @if (is_image($file['mimeType']))
  74. <i class="fa fa-file-image-o fa-lg fa-fw"></i>
  75. @else
  76. <i class="fa fa-file-o fa-lg fa-fw"></i>
  77. @endif
  78. {{ $file['name'] }}
  79. </a>
  80. </td>
  81. <td>{{ $file['mimeType'] or 'Unknown' }}</td>
  82. <td>{{ $file['modified']->format('j-M-y g:ia') }}</td>
  83. <td>{{ human_filesize($file['size']) }}</td>
  84. <td>
  85. <button type="button" class="btn btn-xs btn-danger" onclick="delete_file('{{ $file['name'] }}')">
  86. <i class="fa fa-times-circle fa-lg"></i>
  87. Delete
  88. </button>
  89. @if (is_image($file['mimeType']))
  90. <button type="button" class="btn btn-xs btn-success" onclick="preview_image('{{ $file['webPath'] }}')">
  91. <i class="fa fa-eye fa-lg"></i>
  92. Preview
  93. </button>
  94. @endif
  95. </td>
  96. </tr>
  97. @endforeach
  98.  
  99. </tbody>
  100. </table>
  101.  
  102. </div>
  103. </div>
  104. </div>
  105.  
  106. @include('admin.upload._modal')
  107. @endsection
  108.  
  109. @section('scripts')
  110. <script>
  111. $(function(){
  112. $("#uploads-table").DataTable();
  113. })
  114. </script>
  115. @endsection

经过上面的代码,我们可以看到展示效果,你可以自己在upload目录下创建几个文件夹和文件试试。

下面我们继续写我们 include的 _modal

  1. {{--创建目录--}}
  2. <div class="modal fade" id="modal-folder-create">
  3. <div class="modal-dialog">
  4. <div class="modal-content">
  5. <form action="/admin/upload/folder" method="post" class="form-horizontal">
  6. <input type="hidden" name="_token" value="{{ csrf_token() }}">
  7. {{--隐式传递文件夹--}}
  8. <input type="hidden" name="folder" value="{{ $folder }}">
  9.  
  10. <div class="modal-header">
  11. <button type="button" class="close" data-dismiss="modal">
  12. x
  13. </button>
  14. <h4 class="modal-title">Create New Folder</h4>
  15. </div>
  16. <div class="modal-body">
  17. <div class="form-group">
  18. <label for="new_folder_name" class="col-sm-3 control-label">Folder Name</label>
  19. <div class="col-sm-8">
  20. <input type="text" id="new_folder_name" class="form-control" name="new_folder">
  21. </div>
  22. </div>
  23. </div>
  24. <div class="modal-footer">
  25. <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
  26. <button type="submit" class="btn btn-primary">Create Folder</button>
  27. </div>
  28. </form>
  29. </div>
  30. </div>
  31. </div>
  32.  
  33. {{-- 删除目录 --}}
  34. <div class="modal fade" id="modal-folder-delete">
  35. <div class="modal-dialog">
  36. <div class="modal-content">
  37. <div class="modal-header">
  38. <button type="button" class="close" data-dismiss="modal">
  39. ×
  40. </button>
  41. <h4 class="modal-title">Please Confirm</h4>
  42. </div>
  43. <div class="modal-body">
  44. <p class="lead">
  45. <i class="fa fa-question-circle fa-lg"></i>
  46. Are you sure you want to delete the
  47. <kbd><span id="delete-folder-name1">folder</span></kbd>
  48. folder?
  49. </p>
  50. </div>
  51. <div class="modal-footer">
  52. <form method="POST" action="/admin/upload/folder">
  53. <input type="hidden" name="_token" value="{{ csrf_token() }}">
  54. <input type="hidden" name="_method" value="DELETE">
  55. <input type="hidden" name="folder" value="{{ $folder }}">
  56. <input type="hidden" name="del_folder" id="delete-folder-name2">
  57. <button type="button" class="btn btn-default" data-dismiss="modal">
  58. Cancel
  59. </button>
  60. <button type="submit" class="btn btn-danger">
  61. Delete Folder
  62. </button>
  63. </form>
  64. </div>
  65. </div>
  66. </div>
  67. </div>
  68.  
  69. {{--删除文件--}}
  70. <div class="modal fade" id="modal-file-delete">
  71. <div class="modal-dialog">
  72. <div class="modal-content">
  73. <div class="modal-header">
  74. <div class="modal-title">
  75. <button type="button" class="close" data-dismiss="modal">
  76. x
  77. </button>
  78. <h4 class="modal-title">Please Confirm</h4>
  79. </div>
  80. </div>
  81. <div class="modal-body">
  82. <p class="lead">
  83. <i class="fa fa-question-circle fa-lg"></i>
  84. Are you sure your want to delete the <kbd><span id="delete-file-name1"></span></kbd>
  85. file?
  86. </p>
  87. </div>
  88. <div class="modal-footer">
  89. <form action="/admin/upload/file" method="post">
  90. <input type="hidden" name="_token" value="{{ csrf_token() }}">
  91. <input type="hidden" name="_method" value="DELETE">
  92. <input type="hidden" name="folder" value="{{ $folder }}">
  93. <input type="hidden" name="del_file" id="delete-file-name2">
  94. <button type="button" class="btn btn-default" data-dismiss="modal">
  95. Cancel
  96. </button>
  97. <button type="submit" class="btn btn-danger">
  98. Delete File
  99. </button>
  100. </form>
  101. </div>
  102. </div>
  103. </div>
  104. </div>
  105.  
  106. {{--上传文件--}}
  107. <div class="modal fade" id="modal-file-upload">
  108. <div class="modal-dialog">
  109. <div class="modal-content">
  110. <form action="/admin/upload/file" method="post" class="form-horizontal" enctype="multipart/form-data">
  111. <input type="hidden" name="_token" value="{{ csrf_token() }}">
  112. <input type="hidden" name="folder" value="{{ $folder }}">
  113. <div class="modal-header">
  114. <button type="button" class="close" data-dismiss="modal">
  115. x
  116. </button>
  117. <h4 class="modal-title">Upload New Folder</h4>
  118. </div>
  119. <div class="modal-body">
  120. <div class="form-group">
  121. <label for="file" class="control-label col-sm-3">File</label>
  122. <div class="col-sm-8">
  123. <input type="file" id="file" name="file">
  124. </div>
  125. </div>
  126. <div class="form-group">
  127. <label for="file_name" class="control-label col-sm-3">Optional Filename</label>
  128. <div class="col-sm-4">
  129. <input type="text" id="file_name" name="file_name" class="form-control">
  130. </div>
  131. </div>
  132. </div>
  133. <div class="modal-footer">
  134. <button class="btn btn-default" data-dismiss="modal" type="button">
  135. Cancel
  136. </button>
  137. <button class="btn btn-primary" type="submit">
  138. Upload File
  139. </button>
  140. </div>
  141. </form>
  142. </div>
  143. </div>
  144. </div>
  145.  
  146. {{--浏览图片--}}
  147. <div class="modal fade" id="modal-image-view">
  148. <div class="modal-dialog">
  149. <div class="modal-content">
  150. <div class="modal-header">
  151. <button type="button" class="close" data-dismiss="modal">
  152. x
  153. </button>
  154. <h4 class="modal-title">Image Preview</h4>
  155. </div>
  156. <div class="modal-body">
  157. <img src="" id="preview-image" class="img-responsive">
  158. </div>
  159. <div class="modal-footer">
  160. <button class="btn btn-default" type="button" data-dismiss="modal">Cancel</button>
  161. </div>
  162. </div>
  163. </div>
  164. </div>

紧接着在 admin/upload/index.blade.php 尾部写js:

  1. @section('scripts')
  2. <script>
  3. // 删除文件
  4. function delete_file(name){
  5. $("#delete-file-name1").html(name);
  6. $("#modal-file-delete").modal("show");
  7. }
  8.  
  9. // 删除文件夹
  10. function delete_folder(name){
  11. $("#delete-folder-name1").html(name);
  12. $("#delete-folder-name2").val(name);
  13. $("#modal-folder-delete").modal("show");
  14. }
  15.  
  16. // 上传图片
  17. function preview_image(path) {
  18. $("#preview-image").attr("src", path);
  19. $("#modal-image-view").modal("show");
  20. }
  21. $(function(){
  22. $("#uploads-table").DataTable();
  23. })
  24. </script>
  25. @endsection

至此,咱就可以浏览到效果了。


4 实现功能

4.1 准备

首先添加路由:

  1. Route::group(['namespace' => 'Admin', 'middleware' => 'auth', 'prefix' => 'admin'], function(){
  2. Route::resource('post', 'PostController');
  3. Route::resource('tag', 'TagController', ['except' => 'show']);
  4.  
  5. Route::get('upload', 'UploadController@index');
  6. // 上传文件
  7. Route::post('upload/file', 'UploadController@uploadFile');
  8. // 删除文件
  9. Route::delete('upload/file', 'UploadController@deleteFile');
  10. // 创建文件夹
  11. Route::post('upload/folder', 'UploadController@createFolder');
  12. // 删除文件夹
  13. Route::delete('upload/folder', 'UploadController@deleteFolder');
  14. });

创建需要的Request来进行表单认证:

  1. class UploadFileRequest extends Request
  2. {
  3. /**
  4. * Determine if the user is authorized to make this request.
  5. *
  6. * @return bool
  7. */
  8. public function authorize()
  9. {
  10. return true;
  11. }
  12.  
  13. /**
  14. * Get the validation rules that apply to the request.
  15. *
  16. * @return array
  17. */
  18. public function rules()
  19. {
  20. return [
  21. // 文件必须存在
  22. 'file' => 'required',
  23. // 路径必须存在 以保证上传文件的路径
  24. 'folder' => 'required'
  25. ];
  26. }
  27. }
  1. <?php
  2.  
  3. namespace App\Http\Requests;
  4.  
  5. use App\Http\Requests\Request;
  6.  
  7. class UploadNewFolderRequest extends Request
  8. {
  9. /**
  10. * Determine if the user is authorized to make this request.
  11. *
  12. * @return bool
  13. */
  14. public function authorize()
  15. {
  16. return true;
  17. }
  18.  
  19. /**
  20. * Get the validation rules that apply to the request.
  21. *
  22. * @return array
  23. */
  24. public function rules()
  25. {
  26. return [
  27. // 要创建目录所需要的目录必须存在
  28. 'folder' => 'required',
  29. // 新创建的目录
  30. 'new_folder' => 'required'
  31. ];
  32. }
  33. }

4.2 创建新的目录

UploadController的createFolder方法:

  1. public function createFolder(Requests\UploadNewFolderRequest $request)
  2. {
  3. // 取到我们要创建的目录
  4. $new_folder = $request->get('new_folder');
  5. // 拼接上当前的路径
  6. $folder = $request->get('folder') . '/' . $new_folder;
  7. // 创建新的目录
  8. $result = $this->manager->createDirectory($folder);
  9.  
  10. if ($result === true){
  11. return redirect()->back()->withSuccess("Folder $new_folder created.");
  12. }
  13. $error = $result ? : "An error occurred creating directory";
  14. return redirect()->back()->withErrors([$error]);
  15. }

在uploadManager下完善刚刚用到的方法createDirectory

  1. /**
  2. * 创建一个目录 成功时返回true错误时返回错误信息或false。
  3. *
  4. * @param $folder
  5. * @return string|bool
  6. */
  7. public function createDirectory($folder)
  8. {
  9. $folder = $this->cleanFolder($folder);
  10. // 判断是否存在
  11. if ($this->disk->exists($folder)){
  12. return "Folder $folder already exists";
  13. }
  14. return $this->disk->makeDirectory($folder);
  15. }

4.3 删除目录

  1. public function deleteFolder(Request $request)
  2. {
  3. // 获取要删除的目录
  4. $del_folder = $request->get('del_folder');
  5. // 拼接完整路径
  6. $folder = $request->get('folder') . '/' . $del_folder;
  7. $result = $this->manager->deleteDirectory($folder);
  8.  
  9. if ($result === true){
  10. return redirect()->back()->withSuccess("Folder $del_folder deleted.");
  11. }
  12. return redirect()->back()->withErrors($result);
  13. }

在uploadManager下完善刚刚用到的方法deleteDirectory

  1. /**
  2. * 删除一个目录 成功时返回true错误时返回错误信息或false。
  3. *
  4. * @param $folder
  5. * @return string|bool
  6. */
  7. public function deleteDirectory($folder)
  8. {
  9. $folder = $this->cleanFolder($folder);
  10. // 获取目录下的所有子目录和文件
  11. $filesFolders = array_merge(
  12. $this->disk->directories($folder),
  13. $this->disk->files($folder)
  14. );
  15. // 判断数组是否是空的
  16. if (!empty($filesFolders)){
  17. // 如果不是空的 则不能删除
  18. return "Directory must be empty to delete it.";
  19. }
  20. return $this->disk->deleteDirectory($folder);
  21. }

4.4 删除文件

  1. public function deleteFile(Request $request)
  2. {
  3. $del_file = $request->get('del_file');
  4. $path = $request->get('folder').'/'.$del_file;
  5.  
  6. $result = $this->manager->deleteFile($path);
  7.  
  8. if ($result === true) {
  9. return redirect()
  10. ->back()
  11. ->withSuccess("File '$del_file' deleted.");
  12. }
  13.  
  14. $error = $result ? : "An error occurred deleting file.";
  15. return redirect()
  16. ->back()
  17. ->withErrors([$error]);
  18. }

在uploadManager下完善刚刚用到的方法deleteDirectory

  1. /**
  2. * 删除一个文件 成功时返回true错误时返回错误信息或false。
  3. *
  4. * @param $path
  5. * @return string|bool
  6. */
  7. public function deleteFile($path)
  8. {
  9. $path = $this->cleanFolder($path);
  10.  
  11. // 判断文件是否存在
  12. if (! $this->disk->exists($path)) {
  13. return "File does not exist.";
  14. }
  15.  
  16. return $this->disk->delete($path);
  17. }

4.5 上传文件

  1. public function uploadFile(Requests\UploadFileRequest $request)
  2. {
  3. // 获取到文件信息
  4. $file = $_FILES['file'];
  5. // 获取文件名
  6. $fileName = $request->get('file_name');
  7. $fileName = $fileName ?: $file['name'];
  8. // 拼接路径
  9. $path = str_finish($request->get('folder'), '/') . $fileName;
  10. // 获取内容
  11. $content = File::get($file['tmp_name']);
  12.  
  13. $result = $this->manager->saveFile($path, $content);
  14.  
  15. if ($result === true) {
  16. return redirect()
  17. ->back()
  18. ->withSuccess("File '$fileName' uploaded.");
  19. }
  20.  
  21. $error = $result ? : "An error occurred uploading file.";
  22. return redirect()
  23. ->back()
  24. ->withErrors([$error]);
  25. }

在uploadManager下完善刚刚用到的方法deleteDirectory

  1. /**
  2. * 保存文件 成功时返回true错误时返回错误信息或false。
  3. *
  4. * @param $path
  5. * @param $content
  6. * @return string
  7. */
  8. public function saveFile($path, $content)
  9. {
  10. $path = $this->cleanFolder($path);
  11.  
  12. if ($this->disk->exists($path)) {
  13. return "File already exists.";
  14. }
  15.  
  16. return $this->disk->put($path, $content);
  17. }

注意:如果重命名文件名的话要自行加上后缀哦

Laravel5.1 搭建博客 --上传文件及文件管理的更多相关文章

  1. Laravel5.1 搭建博客 --编译前端文件

    上篇文章写了Gulp编译前端文件,这篇记录下在搭建博客中使用Gulp 1 引入bootstrap和js 1.1 首先先在项目本地安装Bower sudo npm install bower 1.2 创 ...

  2. wordpress搭建博客上传begin主题The themes is locked to another domain

    如题, 在使用wordpress搭建个人博客过程中, 上传begin主题, 出现如下弹框的错误, 而且样式有误. 环境: Los Angeles CentOS 7 x64 nginx+mysql 解决 ...

  3. hexo搭建博客上传至github

    准备工作 ssh key 要先申请好,并且添加至github的ssh库中 安装插件 hexo-deployer-git npm install hexo-deployer-git --save 配置 ...

  4. Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端

    要搞一个小型的cms内容发布系统 因为小程序上线之后,直接对数据库进行操作的话,慧出问题的,所以一般都会做一个管理系统,让工作人员通过这个管理系统来对这个数据库进行增删改查 微信小程序其实给我们提供了 ...

  5. Laravel5.1 搭建博客 --展示简单的首页

    今天起开始搭建博客,把之前学的东西运用下. 1 创建 配置项目 1.1 创建项目 composer create-project laravel/laravel blog 5.1.1 1.2 配置数据 ...

  6. Laravel5.1 搭建博客 --后台登录

    今天咱来实现后台的登录. 首先我们的后台需要三个控制器: PostController:管理文章. TagController:管理文章标签. UploadController:上传文件. 当我们访问 ...

  7. csdn的博客上传word图片

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  8. Laravel5.1 搭建博客 --构建标签

    博客的每篇文章都是需要有标签的,它与文章也是多对多的关系 这篇笔记也是记录了实现标签的步骤逻辑. 在我们之前的笔记中创建了Tag的控制器和路由了 所以这篇笔记不在重复 1 创建模型与迁移文件 迁移文件 ...

  9. Laravel5.1 搭建博客 --文章的增删改查

    教程源于:Laravel学院 继文件上传后呢,咱来搞一搞文章的事情. 1 更改数据表 我们需要改改数据表的结构 因为涉及到重命名列名 所以咱需要引入一个包:Doctrine: composer req ...

随机推荐

  1. Flume日志收集系统介绍

    转自:http://blog.csdn.net/a2011480169/article/details/51544664 在具体介绍本文内容之前,先给大家看一下Hadoop业务的整体开发流程: 从Ha ...

  2. jquery 常用api 小结2

    *一)jQuery常用方法API实战 (1)DOM简述与分类 A)DOM是一种标准,它独立于平台,语言,浏览器. B)如果项目中,你完全按照DOM标准写代码,你就能在各大主流的浏览器中操作标准控件. ...

  3. Python 以指定的概率选取元素

    Python 以指定的概率选取元素 Problem You want to pick an item at random from a list, just about as random.choic ...

  4. jquery 鼠标拖动排序Li或Table

    1.前端页面 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="拖动排序Li或Ta ...

  5. /usr/lib64改名字风波

    注:本文描述请勿模仿,仅限万一遇到这种情况一试. 一不小心做了一个操作: cd /usr mv lib64 lib64-bak 然后奇异的发现: cp不能用了!ls也不能用了…… 提示信息如下: -b ...

  6. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

  7. Atitit.404错误解决标准流程and url汉字中文路径404错误resin4 resin chinese char path 404 err解决

    Atitit.404错误解决标准流程and 错误resin4 resin chinese char path 404 err解决 1. #原因解析 1 2. #解决方式 2 3. 输出图片流... 2 ...

  8. Android实战简易教程-第二十三枪(基于Baas的用户注冊验证username是否反复功能!)

    接上一篇,加入验证用户名是否已经注冊功能! 仅仅须要改动MainActivity.java: package com.example.logintest; import java.util.List; ...

  9. android.view.animation(2) - 插值器Interpolator

    public interface Interpolator implements TimeInterpolator android.view.animation.Interpolator Known ...

  10. Spring Cloud心跳监测

    Spring Cloud实现心跳监测,在服务注册和停止时,注册中心能得到通知,并更新服务实例列表 Spring Cloud注册中心添加配置: eureka.server.enable-self-pre ...