2017-02-22 84 views
1

我使用axios通过ajax发送一个base64字符串。使用下面的方式,当它从base64数据编码回jpg时,我会以某种方式丢失大量数据。我怎样才能发送这个没有数据丢失?base64图像imagecreatefromstring()丢失数据

我从输入抓取文件并将其发送到

var reader = new FileReader(); 
reader.readAsDataURL(file); 

和PHP脚本接收后为BASE64字符串被作为Ajax和爱可信为

axios.post('url', {main: img}) 

$incoming = json_decode(file_get_contents('php://input'))->main; 
$mainImage = str_replace('data:image/jpeg;base64,', '', $incoming); 
$img = imagecreatefromstring(base64_decode($mainImage)); 
$imageSave = imagejpeg($img, './uploaded.jpg'); 

例如,保存在服务器上的最近文件只有14k,但是我上传到i的原始文件输入字段为19k。我将客户端上传的base64输出到预览div,并且该图像保存为19k jpg,因此我认为它是php脚本。关于什么导致数据丢失的任何想法?也许一些axios config value

+1

就直接保存BASE64_DECODE($ mainImage)的'结果'的文件,如:'file_put_contents( './ uploaded.jpg',BASE64_DECODE($ mainImage));'。目前,您正在创建一个新的Jpeg图像,在保存时会稍微压缩一些。 –

+0

@MagnusEriksson我必须将它作为jpg保存在服务器上。我猜axios正在发送我的一串base64数据,但我不知道。我的目标是使用ajax在服务器上获取一个jpg,所以任何不会丢失数据的方式都会很好。 – Harold

+0

尝试上述解决方案。发生的是,前端正在发送编码的二进制图像数据base64。如果你只是将它解码并保存到一个文件中(用'.jpg'-扩展名,就像我的例子),你将得到一个上传图像的_exact_副本。 –

回答

1

会发生什么情况是,前端发送的是二进制图像数据base64编码。

目前,您正在解码图像,创建一个新的图像,并保存为JPG格式。这将只是再次压缩图像。

如果您只解码数据并将其保存到文件(使用.jpg扩展名),您将得到上传图像的准确副本。

incoming = json_decode(file_get_contents('php://input'))->main; 
$mainImage = str_replace('data:image/jpeg;base64,', '', $incoming); 
file_put_contents('./uploaded.jpg', base64_decode($mainImage));