资讯专栏INFORMATION COLUMN

在Laravel项目中实现Ajax上传用户头像

shiina / 1158人阅读

摘要:在编写程序的过程中,经常会遇到一个经典的文件上传场景上传头像图片。基于对最好的用户体验的追求,写一下之前在项目中实现在项目中的上传头像。

在编写web程序的过程中,经常会遇到一个经典的文件上传场景:上传头像(图片)。基于对最好的用户体验的追求,写一下之前在项目中实现在Laravel项目中的Ajax上传头像。

1.配置路由

在Laravel的routes.php中设置路由:

Route::get("/avatar/upload","UsersController@avatar");
Route::post("/avatar/upload","UsersController@avatarUpload");

2.配置控制器

UsersController.php中增加对应的avataravatarUpload这两个方法,前者用来渲染视图,后者处理实际上传的图像文件。

 public function avatar()
    {

        return view("users.avatar");
    }

  public function avatarUpload()
    {
    //some codes to deal with upload avatar
    }

3.编写前端代码

这其实就是在对应的users/文件夹的avatar.blade.php视图文件中设置样式,以下的HTML的各个标签可以根据自己的情况设置classid:

< div class="avatar-upload" id="avatar-upload"> {!! Form::open( [ "url" => ["/avatar/upload/api"], "method" => "POST", "id" => "upload", "files" => true ] ) !!} {!! Form::close() !!}

在js中实现Ajax请求,这里的Ajax借助了Jquery的第三方插件http://malsup.com/jquery/form/:

$(document).ready(function() {
            var options = {
                beforeSubmit:  showRequest,
                success:       showResponse,
                dataType: "json"
            };
            $("#image").on("change", function(){
                $("#upload-avatar").html("正在上传...");
                $("#upload").ajaxForm(options).submit();
            });
        });
    function showRequest() {
        $("#validation-errors").hide().empty();
        $("#output").css("display","none");
        return true;
    }

    function showResponse(response)  {
        if(response.success == false)
        {
            var responseErrors = response.errors;
            $.each(responseErrors, function(index, value)
            {
                if (value.length != 0)
                {
                    $("#validation-errors").append("
"+ value +"
"); } }); $("#validation-errors").show(); } else { $("#user-avatar").attr("src",response.avatar); } }
4.处理上传的图片

回到UsersController.php中的avatarUpload方法,现在就可以处理上传上来的图片了:

public function avatar()
    {
        $this->wrongTokenAjax();
        $file = Input::file("image");
        $input = array("image" => $file);
        $rules = array(
            "image" => "image"
        );
        $validator = Validator::make($input, $rules);
        if ( $validator->fails() ) {
            return Response::json([
                "success" => false,
                "errors" => $validator->getMessageBag()->toArray()
            ]);

        }

        $destinationPath = "uploads/";
        $filename = $file->getClientOriginalName();
        $file->move($destinationPath, $filename);
                return Response::json(
                    [
                        "success" => true,
                        "avatar" => asset($destinationPath.$filename),
                    ]
                );
            }



    }
  

注:在上传之前,确认在laravel的public/目录下创建了uploads/文件夹,并给以相应的权限,如:

sudo chmod -R 777 uploads/

在上面的avatarUpload方法中,有一个wrongTokenAjax方法,这是用来检验Laravel体系的token值的,同样是在UsersController.php中添加:

 public function wrongTokenAjax()
    {
        if ( Session::token() !== Request::get("_token") ) {
            $response = [
                "status" => false,
                "errors" => "Wrong Token",
            ];

            return Response::json($response);
        }

    }

5.最后

到这里一个简单的Ajax上传图片的demo就完成了,在实际的开发中,我们还需要考虑以下几个问题:

根据用户的不同用户名或者用户id来创建不同的文件夹,这些都可以在avatarUpload方法中 $file->move($destinationPath, $filename)之前使用

File::exists($username) or File::makeDirectory($username);

更新数据库中用户的avatar字段,大概是这样的:在avatarUpload方法返回数据之前,使用下面的类似语句:

$user->avatar = your_avtar_upload_path;

$user->save();

如果你还想更进一步改善体验,提供一些图片的裁剪和添加滤镜等功能,可以同时使用 Intervention/Image php包和Jcrop js图片裁剪实现,比如在:

function showResponse(response)  {

}

中,如果成功的返回图片,就在$("#user-avatar").attr("src",response.avatar)后执行:

 $("#user-avatar").Jcrop({
                aspectRatio: 1,
                onSelect: updateCoords,
                setSelect: [120,120,10,10]
                });

就可以在前端实现图片裁剪,然后将相应的裁剪数据如裁剪图片的height,width,x-align.y-align等传到后端处理就可以,使用Intervention/Image的话,在后端处理图片就是轻而易举的事情了!

Happy Hacking

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21007.html

相关文章

  • JS 中实 Laravel 的 route 函数

    摘要:所以推荐给每个路由都命个名,并通过路由名的方式来获取。所以我就考虑能不能在中实现一个类似后端的函数。最终的解决方案很简单,两个函数就可以搞定。 在Laravel的路由模块里,我们可以给每一个路由设定一个名字,比如: Route::get(/blog/{blog}, BlogController@show)->name(blog.show); 然后就可以通过 route(blog.sho...

    zhangqh 评论0 收藏0
  • laravel-admin 文件上传OSS

    摘要:前言因为项目需求,需要把图片上传至阿里云,我的接口和后台项目是分开的,都使用的框架开发,接入这里就不做讨论了,这里主要说一下上传阿里的问题。 前言 因为项目需求,需要把图片上传至阿里云 OSS,我的 Api 接口和后台项目是分开的,都使用的 laravel 框架开发,Api 接入 OSS 这里就不做讨论了,这里主要说一下 laravel-admin 上传阿里 OSS 的问题。 网上的一...

    darkbaby123 评论0 收藏0
  • node简单实一个更改头像功能

    摘要:前言一直想写这篇文章,无奈由于要考试的原因,一直在复习,拖延到现在才写,之前用的框架写了个小项目,里面有个上传图片的功能,这里记录一下如何实现我使用的是思路首先,当用户点击上传头像,更新头像的时候,将头像上传到项目的一个文件夹里面我是存放在 前言 一直想写这篇文章,无奈由于要考试的原因,一直在复习,拖延到现在才写?,之前用 node 的 express 框架写了个小项目,里面有个上传图...

    BlackFlagBin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<