JCrop和Ajax图像上传和裁剪(laravel 5,Jquery)

时间:2015-07-07 12:08:13

标签: javascript php jquery ajax jcrop

我目前正在网站上构建图片上传和裁剪功能。工作流程如下

按下了上传按钮。 2.使用上传框打开模态

模态代码:

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title" id="myModalLabel">Upload Profile Picture</h4>
        </div>
        <div class="modal-body">
            <div id="load" class="display-none" style="width:32px;margin:150px auto;"><img src="img/loading2.gif"></div>
            <div class="upload-container">
             {!! Form::open(['file' => true, 'Method' => 'POST', 'id' => 'profile-image-upload']) !!}

            <div class="alert alert-danger display-none error">
                <p>File must be an image</p>
            </div>

            <div class="form-group">
                {!! Form::label('upload', 'Upload Photo') !!}
                {!! Form::file('upload', ['id' => 'file-select', 'class' => 'form-control upload-box']) !!}
            </div>

            {!! Form::close() !!}
            </div>
            <div id="image-box" class="image display-none" style="text-align:center;">
                <img id="large-image" src="" style="max-width:100%;max-height:500px;display:inline-block;">
            </div>
        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-default close-button" data-dismiss="modal">Close</button>
            <button type="button" class="btn btn-primary">Save changes</button>
        </div>
    </div>
</div>

  1. 点击浏览按钮并选择一张照片,这会立即触发ajax请求上传图片并返回路径。
  2. 服务器端代码:

    Route::post('upload-profile-pic', function(){
    
    $input['file'] = Request::file('upload');
    $rules = ['file' => 'mimes:jpg,png,gif,jpeg'];
    
    $validator = Validator::make(
        $input,
        $rules
    );
    
    if ($validator->fails())
        return 'false';
    
    $identifier = str_random(20);
    $image = Image::make(Request::file('upload'));
    $image->encode('png')->save(public_path(). '/profile-images/temp/' . $identifier . '.png');
    
    return $identifier;
    });
    
    1. 在ajax成功之后,我将生成的图像加载到div中并在模态中显示。
    2. Javascript(Jquery):

          $('input[type=file]').change(function () {
      
              $('#load').show();
      
              var formData = new FormData($('#profile-image-upload')[0])
      
              $('.upload-container').hide();
      
              $.ajax({
                  type: 'POST',
                  url: 'upload-profile-pic',
                  data: formData,
                  cache: false,
                  contentType: false,
                  processData: false,
                  success: function (data) {
                      $('#load').hide();
                      console.log("success");
                      if (data != 'false')
                          console.log(data)
                      $("#large-image").attr('src', '/profile-images/temp/' + data + '.png');
                      $('.image').show();
                      if (data == 'false')
                          $('.upload-container').show();
                      $('.error').show();
                  },
                  error: function (data) {
                      $('#load').hide();
                      console.log("error");
                      console.log(data);
                  }
              });
          });
      
          $('#myModal').on('hidden.bs.modal', function () {
              $('.error').hide();
              $('.upload-container').show();
              $('.image').hide();
              $('#profile-image-upload').trigger("reset");
          })
      
          $('.close-button').on('click', function () {
              $('.error').hide();
              $('.upload-container').show();
              $('.image').hide();
              $('#profile-image-upload').trigger("reset");
          });
      

      我还有两个功能可以在模式被取消时重置模态,这只是隐藏图像并显示上传框。

      这一切都正常,但我的问题是我想将Jcrop应用于生成的图像。我尝试了很多东西

      在ajax成功功能中我添加了这个

      $("#large-image").attr('src', '/profile-images/temp/' + data + '.png').Jcrop();
      

      以上工作是第一次,但如果模态已关闭,然后用户再次尝试,则不会用新图像替换旧图像。

      我尝试添加

      .done(fucntion(){
          $("#large-image").Jcrop(
      });
      

      这与最后一个选项相同,第一次运行但在此之后不起作用。

      我试过了

      var image = $("#large-image");
      

      然后将此添加到我的ajax成功

      image.Jcrop()
      

      并将其添加到结束函数

      image.destroy()
      

      这与上次第一次恶化并且detroy()在控制台中抛出错误的时间相同。

      JavaScript不是我的强项,我现在非常坚持这个,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

使用以下代码解决了这个问题:

$("#large-image").attr('src', '/profile-images/temp/' + data['identifier'] + '.png').Jcrop({}, function () {
      jcrop_api = this;
      $('.modal-dialog').animate({width: ($('#large-image').width() + 50)});
});

然后当关闭模态我打电话

jcrop_api.destroy()