我在前端用js将图片转成Base64字符串,通过ajax上传到另一台服务器上.
在服务器端反转成图片时失败..
仔细比较后,发现.net转出来的Base64字符,与js转出来的不一样,C#转出来的末尾要多几个字符,
如下图:
开始我以为可能js转的时候没有将图片格式的扩展名转进去,后来我单独将扩展名的部分转出来,不等于上边的那几个字符..
下边是我js转和c#转的代码,麻烦大家帮我看下怎么解决..
前端JS
var reader = new FileReader(); reader.onload = function (e) { //图片base64数据 var imgBase64Data = e.target.result; var pos = imgBase64Data.indexOf("4")+2; imgBase64Data = imgBase64Data.substring(pos, imgBase64Data.length - pos);//去掉Base64:开头的标识字符 $.ajax({ type: "POST", url: "http://imginapi.com/image/AddImage", async: false, xhrFields: { withCredentials: true }, data: { 'base64StrImgData': imgBase64Data, 'imgFormat': fileext}, dataType: "text", success: function (data) { alert(data); domUtils.on(iframe, 'load', callback); }, error: function (err) { alert("error"); alert(err.responseText); } }); return; }; reader.readAsDataURL(input.files[0]);
后台C#代码:
/// <summary> /// 图像转换为Base64编码 /// </summary> /// <param name="image">图像</param> /// <param name="format">图像格式</param> /// <param name="throwException">出现异常时是否抛出</param> /// <returns>转换成功返回其Base64编码;失败返回空串</returns> public static string ImageToBase64(System.Drawing.Image image, ImageFormat format, OPResult opRes, bool throwException = false) { return ExceptionHelper.ExceptionRecord(() => { string base64String = ""; try { using (MemoryStream ms = new MemoryStream()) { image.Save(ms, format); byte[] imageBytes = ms.ToArray(); base64String = Convert.ToBase64String(imageBytes); } } catch (Exception ex) { throw new Exception("将图片转成base64字符串时出现异常:" + ex); } return base64String; }, opRes, throwException); }
说明一下,不是传到后台后没有用escape编码的问题,在前台跟踪时还没开始ajax请求,仅仅是刚刚转成Base64字符的时候.
为什么会多出几个字符呢..哪位高手知道?
Base64应该是C#出来的那种结果,怀疑你的js转换出问题了。先把e.target.result打印出来看看,是不是截取出问题了。另外可以考虑使用canvas.toDataUrl这种方式来创建base64字符串。
太对了.就是截取出问题了..谢谢提醒
@hexllo: 搞定就好!