base64编码图片数据存储服务器

base64编码图片数据存储服务器如果直接提交base64编码图片数据,过大的话后台会出现转发错误问题。我在刚开始接触base64编码图片数据时,就是把base64编码图片数据传到后台来解码生成图片。导致生成的图片无法打开,后来才发现其实传到后台的base64编码根本就不完整,导致解码出现问题,无法显示图片。所以,base64编码只能在前端处理。后来查阅资料,看见一个不错的解决方式就是

大家好,又见面了,我是你们的朋友全栈君。

base64编码图片数据存储服务器

如果直接提交base64编码图片数据,过大的话后台会出现转发错误问题。

我在刚开始接触base64编码图片数据时,就是把base64编码图片数据传到后台来解码生成图片。导致生成的图片无法打开,后来才发现其实传到后台的base64编码根本就不完整,导致解码出现问题,无法显示图片。所以,base64编码只能在前端处理。

后来查阅资料,看见一个不错的解决方式就是将base64编码的图片数据转换为Blob(与File相似)并添加到form中提交。下面是代码:

$(".avatar-save").on("click", function() {
		var img_lg = document.getElementById('imageHead');
		// 截图小的显示框内的内容
		html2canvas(img_lg, {
			allowTaint: true,
			taintTest: false,
			onrendered: function(canvas) {
				canvas.id = "mycanvas";
				//生成base64图片数据
				var dataUrl = canvas.toDataURL("image/png");
				var newImg = document.createElement("img");
				newImg.src = dataUrl;
				imagesAjax(dataUrl);//提交base64图片数据
			}
		});
	})

//dataUrl	base64图片数据
function imagesAjax(dataUrl) {
		//这里连带form里的其他参数也一起提交了,如果不需要提交其他参数可以直接FormData无参数的构造函数
    		var formData = new FormData();//var formData = new FormData(form);
   		//convertBase64UrlToBlob函数是将base64编码转换为Blob
   		//append函数的第一个参数是后台获取数据的参数名,和html标签的input的name属性功能相同
   		formData.append("ImgBase64",convertBase64UrlToBlob(dataUrl));  
   		console.log(formData);
    		//ajax 提交form
		$.ajax({
			url:'uploadImage.action',
			type:'POST',
			data:formData,
			 dataType:"text",
      		 	processData : false,         // 告诉jQuery不要去处理发送的数据
       		 	contentType : false,        // 告诉jQuery不要去设置Content-Type请求头
			success: function(data) {
				 top.layer.alert("头像更新成功!");
				 window.location.reload();//刷新当前页面 
			},
			error:function(){
                    top.layer.alert("头像更新失败,请检查网络后重试!")
            }
		});
	}

/**
	 * 将以base64的图片url数据转换为Blob
	 * 	@param urlData
	 *   用url方式表示的base64图片数据
	 */
	function convertBase64UrlToBlob(urlData){
	    var bytes=window.atob(urlData.split(',')[1]);        //去掉url的头,并转换为byte
	    //处理异常,将ascii码小于0的转换为大于0
	    var ab = new ArrayBuffer(bytes.length);
	    var ia = new Uint8Array(ab);
	    for (var i = 0; i < bytes.length; i++) {
	        ia[i] = bytes.charCodeAt(i);
	    }
	    return new Blob( [ab] , {type : 'image/png'});
	}

最后注意的是,因为提交到后台的是Blob类型的数据,没有文件名称,需要强制重新命名名称及类型。

我这里采用的是springMVC注解的方式 接收请求。通过org.springframework.web.multipart.MultipartHttpServletRequest  就可以拿到文件。

/**
	 *添加/更新/替换图片
	 * @param request
	 * @return
	 */
	@ResponseBody
	@RequestMapping(method = RequestMethod.POST,value="information/uploadImage")
	public String uploadImage(HttpServletRequest request,HttpSession session){
		String basePath = request.getSession().getServletContext().getRealPath("upload");
		Manager manager= (Manager)session.getAttribute("manager");
		JSONObject obj = new JSONObject();
		//将文件交给文件处理工具类处理
		List<Map<String, String>> fileName = UploadFileUtil.uploadBlodImage(request,"/image");
		Accessory accessory = new Accessory();
		for (Map<String, String> map : fileName) {
			//取出用户名称
			accessory.setAccessoryName(map.get("fileName"));
			//取出路径别名
			accessory.setUuidFileName(map.get("newFilePath"));
			//取出上传文件大小
			accessory.setValueSize(map.get("valueSize"));
			//将资源附件进行存储并返回附件关联代码
			managerService.addOrUpdateManagerToAccessory(accessory, manager.getId(), basePath);
		}
		return obj.toString();
	}	
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129385.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux档案属性

    Linux档案属性

    2021年9月14日
    47
  • 新手编程入门先学什么?

    新手编程入门先学什么?编程入门先学什么?关于编程的基本语言,想学习的朋友或多或少都会知道一些。C、C++、Python和Java一样,它们是通用编程语言,而JavaScript和PHP算是web环境的专用编程语言。但事实上,有许多种编程语言。如果想入门编程,学习的编程语言也有很多。编程入门先学什么?随着计算机的普及,越来越多的朋友开始走上自学编程的道路。那么,作为初学者,学习编程要如何入门?编程入门先学什么?一、先了解什么是编程如果你想学习一门新知识,你应该首先了解这门知识。通过内容可以做些什么?我们可以用什么样

    2022年6月15日
    33
  • gridview属性_datagridview设置列宽

    gridview属性_datagridview设置列宽usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Drawing;usingSystem.Windows.Forms;classSetDataViewGirdStyle{   privatestaticColor_mLinearBeginColor;

    2022年9月24日
    1
  • centos7卸载MySQL_centos7下安装mysql

    centos7卸载MySQL_centos7下安装mysql**centos7下mysql卸载**1.关闭mysql服务servicemysqldstop2.删除mysql目录whereismysql——找到mysql目录rm-rfxxxxx——xxxxx代表mysql目录3.删除mysql相关配置文件my.cnf4.后记此方法针对于网络状况不好的服务器,不是yum或者rpm方法安装mysql的卸载同样有效…

    2022年9月30日
    2
  • java基本运算符及应用,这是一个闰年吗_苹果12.6. 1正式发布

    java基本运算符及应用,这是一个闰年吗_苹果12.6. 1正式发布方法1:importjava.util.Scanner;publicclassShixun1{publicstaticvoidmain(Stringargs[]){Scannerinput=newScanner(System.in);System.out.println(“请输入年份:”);intyear=input.nextInt();if(year%400==0||(…

    2025年6月2日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号