>PHP 프레임워크 >Laravel >Laravel 프로젝트에서 사용자 아바타를 업로드하기 위해 Ajax를 구현하는 방법에 대한 자세한 설명

Laravel 프로젝트에서 사용자 아바타를 업로드하기 위해 Ajax를 구현하는 방법에 대한 자세한 설명

藏色散人
藏色散人앞으로
2021-02-17 10:14:382356검색

Laravel 프로젝트에서 사용자 아바타를 업로드하기 위해 Ajax 구현

웹 프로그램을 작성하는 과정에서 우리는 아바타(사진) 업로드라는 고전적인 파일 업로드 시나리오를 자주 접하게 됩니다. 최고의 사용자 경험 추구를 바탕으로 이전에 Laravel 프로젝트에서 구현한 Ajax 업로드 아바타에 대해 작성해 보겠습니다. 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:

<header class="profile-header">
 <img id="user-avatar" src="https://wt-prj.oss.aliyuncs.com/0d06af79c49d4e08abb1ab3f7ab6e860/772c684b-10a4-43cf-8eec-dda9e28a5a23.png">

<p id="validation-errors"></p>

<p class="avatar-upload" id="avatar-upload">
 {!! Form::open( [ 'url' => ['/avatar/upload/api'], 'method' => 'POST', 'id' => 'upload', 'files' => true ] ) !!}
<a href="#" class="btn button-change-profile-picture">
<label for="upload-profile-picture">
<span id="upload-avatar">更换新头像</span>
 <input name="image" id="image" type="file" class="manual-file-chooser js-manual-file-chooser js-avatar-field">
</label>
</a>
{!! Form::close() !!}


<p class="span5">
<p id="output" style="display:none">
</p>
</p>


<span id="filename"></span>
 </header>

在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('<p class="alert alert-error"><strong>'+ value +'</strong><p>');
                }
            });
            $("#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就完成了,在实际的开发中,我们还需要考虑以下几个问题:

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

    File::exists($username) or File::makeDirectory($username);
  2. 更新数据库中用户的avatar字段,大概是这样的:在avatarUpload方法返回数据之前,使用下面的类似语句:

    $user->avatar = your_avtar_upload_path;
    
    $user->save();
  3. 如果你还想更进一步改善体验,提供一些图片的裁剪和添加滤镜等功能,可以同时使用 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

    1. 라우팅 구성

    Laravel의 routes.php에서 라우팅 설정:
  4. rrreee

    2. 컨트롤러 구성

에서 해당 항목을 추가합니다. avataravatarUpload 메소드를 .php로 변환합니다. 전자는 뷰를 렌더링하는 데 사용되고 후자는 실제로 업로드된 이미지 파일을 처리합니다.
rrreee

3. 프론트엔드 코드 작성

🎜실제로는 해당 users/avatar.blade.php 뷰 파일에서 스타일을 설정하는 것입니다. > 폴더에서 다음 HTML의 각 태그는 상황에 따라 classid를 설정할 수 있습니다. 🎜rrreee🎜는 js에서 Ajax 요청을 구현합니다. Jquery 플러그인 http://malsup.com/jquery/form/: 🎜rrreee

4. 업로드된 이미지 처리

🎜 UsersController.php의 <code>avatarUpload로 돌아갑니다. code> code> 메소드를 사용하면 이제 업로드된 이미지를 처리할 수 있습니다: 🎜rrreee<blockquote>🎜참고: 업로드하기 전에 laravel의 <code>public/ 디렉토리에 uploads/가 생성되었는지 확인하세요. code> 폴더를 선택하고 다음과 같은 해당 권한을 부여합니다. 🎜rrreee🎜위의 avatarUpload 메서드에는 wrongTokenAjax 메서드가 있는데, 이를 확인하는 데 사용됩니다. Laravel 시스템의 token 값에 UsersController.php도 추가하세요: 🎜rrreee

5. 마지막으로

🎜다음은 간단한 Ajax 이미지 업로드가 완료되었습니다. 실제 개발에서는 다음 문제를 고려해야 합니다. 🎜
  1. 🎜사용자의 다른 사용자 이름 또는 사용자 ID에 따라 생성합니다. 다른 폴더는 이전에 사용할 수 있습니다. 데이터베이스를 업데이트하려면 avatarUpload 메서드 🎜rrreee🎜
  2. 🎜의 $file->move($destinationPath, $filename) 사용자의 아바타code> 필드는 다음과 같습니다. avatarUpload 메서드가 데이터를 반환하기 전에 아래 유사한 문을 사용합니다. 🎜rrreee🎜
  3. 🎜변경하려는 경우 환경을 더욱 개선하려면 일부 이미지 자르기 및 필터 추가 기능을 사용하면 Intervention/Image php 패키지와 Jcrop js 이미지 자르기를 동시에 사용할 수 있습니다. 예를 들어 🎜rrreee🎜에서 이미지가 성공적으로 반환되면 $('#user- Avatar').attr('src',response.avatar)실행 후: 🎜rrreee🎜, 프런트 엔드에서 이미지 자르기를 구현한 다음 해당 자르기 데이터를 height
,width,x-align.y-align은 Intervention/Image를 사용하여 처리를 위해 백엔드로 전달할 수 있습니다. 그렇다면 백엔드에서 이미지를 처리하는 것은 매우 쉬운 일이 될 것입니다! 🎜🎜🎜🎜

위 내용은 Laravel 프로젝트에서 사용자 아바타를 업로드하기 위해 Ajax를 구현하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제