您的位置:

利用Laravel实现文件上传

一、上传文件的目的及概述

文件上传是指用户将本地文件上传到服务器上,存储时一般使用文件存储系统进行存储,这样用户上传的文件可以在后台进行统一管理。

本文将介绍利用Laravel实现文件上传的步骤,包括如何设置表单、编写控制器、存储文件和实现表单上传。同时也会讨论一些常见的文件上传问题和解决方法。

二、引入文件上传包

首先需要在Laravel中引入文件上传包,可以使用laravel的文件上传扩展包"laravelcollective/html"。)

composer require "laravelcollective/html":"^5.4.0"

在项目的composer.json文件中加入如下内容:

"require": {
        ...
           "laravelcollective/html": "^5.4.0"
        ...
    },

"providers": [
        ...
          Collective\Html\HtmlServiceProvider::class,
        ...
    ],

"aliases": {
        ...
            'Form' => Collective\Html\FormFacade::class,
            'Html' => Collective\Html\HtmlFacade::class,
        ...
    }

三、编写文件上传界面

在这一步,我们将展示如何编写一个文件上传表单。创建一个路由,上传文件的界面在这个路由上进行展示。

Route::get('/file-upload', function () {
    return view('file_upload.index');
});

创建一个file_upload目录,在文件上传视图页面中,我们需要使用Laravel collective表单,所以必须在页面顶部添加 "@php echo Form::open(array('url' => '/file-upload','files'=>'true')) @endphp" ,然后在表单结束之前添加 "@php echo Form::close() @endphp" 。


@php echo Form::open(array('url' => '/file-upload','files'=>'true')) @endphp
   <input type="file" name="file">
   

@php echo Form::close() @endphp

四、编写文件上传控制器

在上传文件视图页面中,创建一个提交按钮,用于提交文件上传表单,这时候系统会调用上传控制器Controller来执行上传动作。

Route::post('/file-upload', function (\Illuminate\Http\Request $request) {
    $file = $request->file('file');

    // 如果上传文件不为空,表示有文件
    if (!empty($file)) {

        // 保存文件,文件保存在/public/uploads目录中,并返回图片路径
        $path = $file->store('uploads');

        // 监听文件上传状态,如果上传失败,返回错误信息
        if (empty($path)) {
            return response()->json([
                'code' => -1,
                'msg' => '文件上传失败!'
            ]);
        }

        return response()->json([
            'code' => 0,
            'msg' => '文件上传成功!',
            'data' => [
                'url' => asset($path)
            ]
        ]);
    }

    // 如果上传文件为空,表示没有文件
    return response()->json([
        'code' => -1,
        'msg' => '没有选择上传文件!'
    ]);
})->name('file.upload');  

五、存储上传文件

在这一步,我们使用store方法将上传的文件存储到我们指定的位置。在Laravel中,我们可以使用store方法完成文件上传,并返回上传文件的路径。

下面使用upload()方法进行文件的上传和存储,存储路径为public/uploads目录。通过asset()方法获取储存路径,返回到页面上。注意需要开启Laravel项目public文件夹的读写权限。

六、常用问题解决方法

1.文件上传失败

首先,确认你的upload目录是否有写权限(chmod 777)。

其次,检查上传文件的大小限制,修改post_max_size和upload_max_filesize的大小。

2.上传过程中,出现空文件

首先,确认你的form表单是否添加了enctype="multipart/form-data"属性。

其次,确认表单是否要求必填,如果必填,必须通过isset函数确认上传文件是否存在,此时可以在控制器代码的开头加上缺少这个信息的判断,否则会发生未定义变量的错误:

if(!isset($_FILES['file'])){
    echo "请上传文件";exit();
}

七、代码示例

上传文件的表单界面:


@php echo Form::open(array('url' => '/file-upload','files'=>'true')) @endphp
   <input type="file" name="file">
   

@php echo Form::close() @endphp <script> $(function () { // 提交表单 $('form').submit(function (event) { event.preventDefault(); // 发送ajax请求 $.ajax({ url: '{{ route('file.upload') }}', data: new FormData(this), type: 'POST', cache: false, processData: false, contentType: false, success: function (response) { if (response.code === 0) { var url = response.data.url; console.log("文件已经上传到服务器:"+url); } else { console.log(response.msg); } }, error: function (xhr, textStatus, errorThrown) { console.log(textStatus + ": " + errorThrown); } }); }); }); </script>

上传文件的控制器内容:

Route::post('/file-upload', function (\Illuminate\Http\Request $request) {
    $file = $request->file('file');

    // 如果上传文件不为空,表示有文件
    if (!empty($file)) {

        // 保存文件,文件保存在/public/uploads目录中,并返回图片路径
        $path = $file->store('uploads');

        // 监听文件上传状态,如果上传失败,返回错误信息
        if (empty($path)) {
            return response()->json([
                'code' => -1,
                'msg' => '文件上传失败!'
            ]);
        }

        return response()->json([
            'code' => 0,
            'msg' => '文件上传成功!',
            'data' => [
                'url' => asset($path)
            ]
        ]);
    }

    // 如果上传文件为空,表示没有文件
    return response()->json([
        'code' => -1,
        'msg' => '没有选择上传文件!'
    ]);
})->name('file.upload');

八、总结

本文详细介绍了利用Laravel进行文件上传的相关知识和步骤,包括引入文件上传包、编写文件上传表单、编写文件上传控制器、存储上传文件、常用问题解决方法等内容。通过学习,我们可以更轻松地实现在Laravel中上传文件的操作。