尝试通过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}}
任何帮助?
答案 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]