Laravel AJAX图像上传错误:图像源不可读

时间:2014-12-20 20:40:37

标签: php ajax laravel-4 image-uploading

尝试通过AJAX上传图片,但遇到问题......

表格:

{{ Form::open(array('class' => 'update-insertimage-form', "files" => true,)) }}
    {{ Form::file('image', array('class' => 'update-insertimage-btn', 'name' => 'update-insertimage-btn')) }}
{{ Form::close() }}

PHP:

$createImage = Image::make(Input::file('update-insertimage-btn'))->orientate();
$createImage->resize(600, null, function ($constraint) {
$constraint->aspectRatio();
});
$createImage->save("user_uploads/cover_images/TEST.jpeg");

jQuery的:

$('.update-insertimage-form').submit(function() {
  $(".submit-newupdate-btn").addClass('disabled');
  var rootAsset = $('.rootAsset').html();
  $.ajax({
    url: rootAsset+'saveUploadedImage',
    type: 'post',
    cache: false,
    dataType: 'json',
    data: $('.update-insertimage-form').serialize(),
    beforeSend: function() {
    },
    success: function(data) {
      if(data.errors) {
        $('.modal-body').append('<div class="alert alert-danger centre-text modal-error-message" role="alert"><strong>Error!</strong> '+ data.errors +'</div>');
      } else if (data.success) {
        $(".form-control-addupdate").append(data.name);
      }
    },
    error: function(xhr, textStatus, thrownError) {
        alert('Something went to wrong.Please Try again later...');
    }
  });
return false;
});

我使用相同的精确代码,其中哪些工作正常但不适用于AJAX(不确定是否与它有任何关系)

错误是这样的:

{"error":{"type":"Intervention\\Image\\Exception\\NotReadableException","message":"Image source not readable","file":"\/Applications\/MAMP\/htdocs\/buildsanctuary\/vendor\/intervention\/image\/src\/Intervention\/Image\/AbstractDecoder.php","line":257}}

任何帮助?

1 个答案:

答案 0 :(得分:2)

您无法对图像进行序列化并将其传递过来,您需要构建一个FormData对象并使用它来发送图像。

var formData = new FormData();
formData.append('update-insertimage-btn[]', $('.update-insertimage-btn')[0].files[0], $('.update-insertimage-btn')[0].files[0].name);

然后你只需将它作为数据传递给服务器以及其他一些选项:

data: formData,
processData: false,
contentType: false

现在你可以做到:

Image::make(Input::file('update-insertimage-btn'))->orientate()

从这里的https://github.com/Intervention/image/blob/master/src/Intervention/Image/AbstractDecoder.php页面传来以下检查:

case $this->isDataUrl():
     return $this->initFromBinary($this->decodeDataUrl($this->data));

从该函数返回true:

public function isDataUrl()
{
    $data = $this->decodeDataUrl($this->data);
    return is_null($data) ? false : true;
}

正在触发将decodeDataUrl的结果作为参数传递的抽象函数initFromBinary,而decodeDataUrl看起来像:

private function decodeDataUrl($data_url)
{
    $pattern = "/^data:(?:image\/[a-zA-Z\-\.]+)(?:charset=\".+\")?;base64,(?P<data>.+)$/";
    preg_match($pattern, $data_url, $matches);
    if (is_array($matches) && array_key_exists('data', $matches)) {
        return base64_decode($matches['data']);
    }
    return null;
}

所以看起来它希望该元素是base64编码的图像而不是原始的二进制图像;因此,base64会在您传递图像时对图像进行编码,而不是传递.files[0]