VichUploader和CroppieJS:如何发送base64裁剪图像以在Symfony 4中保留
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VichUploader和CroppieJS:如何发送base64裁剪图像以在Symfony 4中保留相关的知识,希望对你有一定的参考价值。
我有一个使用CroppieJS的小型symfony 4应用程序和一个裁剪器。当我裁剪并点击保存按钮时,croppie会向我发送base64图像:
$( "#cropSave" ).click(function() {
basic.croppie('result','canvas'
).then(function (result) {}
如何将此结果发送到我的控制器并使用VichUploader和Doctrine保留图像?
这是我的控制器:
public function updateProfilePicture(Request $request): Response
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$user = $this->getUser();
$entityManager = $this->getDoctrine()->getManager();
$user->setImageFile($request->files->get('image'));
$entityManager->flush();
return new Response("ok");
}
我尝试了很多东西,但我必须缺乏经验,因为它不起作用:
var form = document.getElementById("myAwesomeForm");
var ImageURL = result;
// Split the base64 string in data and contentType
var block = ImageURL.split(";");
// Get the content type of the image
var contentType = block[0].split(":")[1];
// get the real base64 content of the file
var realData = block[1].split(",")[1];
// Convert it to a blob to upload
var blob = b64toBlob(realData, contentType);
// Create a FormData and append the file with "image" as parameter name
var formDataToUpload = new FormData(form);
formDataToUpload.append("image", blob);
要么
function urltoFile(url, filename, mimeType){
return (fetch(url)
.then(function(res){return res.arrayBuffer();})
.then(function(buf){return new File([buf], filename, {type:mimeType});})
);
}
这是我的一个ajax请求:
$.ajax({
type : "POST",
data: formDataToUpload,
url : $('#updateProfilePictureLink').val(),
contentType:false,
processData:false,
cache:false,
dataType:"json",
success : function(response) {
$('#profilePicture').attr('src', result);
alert(response);
},
error : function (response) {
alert("error !");
}
});
我想可能使用VichUploader formType输入字段从base64“模拟”JS中的文件上传,但我想知道是否有更简单的方法。
谢谢
答案
感谢Ronnie Hint,我设法解决了这个问题。你必须 :
- 使用JS FormData
- 把blob放进去
- 在Symfony控制器中将其作为图像检索
- 按原样保存
但是你必须在图像的实体上实现serializable(序列化和反序列化所有字段,除非它会破坏你的其他功能)。
这是工作代码示例:
// JS
$( "#cropSave" ).click(function() {
alert("click !");
basic.croppie('result','blob'
).then(function (result) {
var fd = new FormData();
//Third parameter is the blob name
fd.append('data',
result,$('#userId').val()+"."+result.type.split("/")[1]);
$.ajax({
type: 'POST',
url : $('#updateProfilePictureLink').val(),
data: fd,
processData: false,
contentType: false
}).done(function(data) {
// your things
});
// php
// Controller
try {
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$user = $this->getUser();
$entityManager = $this->getDoctrine()->getManager();
$user->setImageFile($request->files->get('data'));
$entityManager->flush();
}
catch (exception $e) {
}
// Entity
class User implements UserInterface, Serializable
{
/** @see Serializable::serialize() */
public function serialize()
{
return serialize(array(
$this->id,
$this->profilePicture,
$this->email,
$this->password
));
}
/** @see Serializable::unserialize() */
public function unserialize($serialized)
{
list (
$this->id,
$this->profilePicture,
$this->email,
$this->password
) = unserialize($serialized);
}
以上是关于VichUploader和CroppieJS:如何发送base64裁剪图像以在Symfony 4中保留的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 5. EasyAdmin 3. VichUploader。同时上传多个文件
Symfony VichUploader:无法看到要上传的文件按钮
Symfony vichUploader tmp 文件不存在
无法确定类“App\Entity\XXXX”中属性“image”的访问类型。 Symfony 4 - EasyAdmin 3.2 - VichUploader