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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 反掩码与通配符掩码[通俗易懂]

    反掩码与通配符掩码[通俗易懂]掩码我们学数通的应该都很熟悉,我们刚刚学习IP的时候肯定都学过,这里就不在叙述。今天我们要说的是反掩码和通配符掩码,反掩码相信大家也都不陌生,我们配置OSPF的时候都能用的到但是很多网工也就知道配置OSPF就要那么配置,用255.255.255.255减去正掩码就是反掩码,但是反掩码是啥却说不出来。反掩码掩码顾名思义就是正掩码反过来,正掩码是连续的1和0构成,用来…

    2022年7月24日
    9
  • DropDownList1_SelectedIndexChanged-的使用

    DropDownList1_SelectedIndexChanged-的使用怎样使当DropDownList1改变时也改变相应的DropDownList2的值?实现二级联动。如省市联动啊。以下有代码。将DropDownList1的AutoPostBack属性设为true导入命名空间ImportsSystem.DataImportsSystem.Data.SqlClientPrivateSubPage_Load(ByValsen

    2022年7月18日
    13
  • java获取Date时间的各种方式汇总「建议收藏」

    java获取Date时间的各种方式汇总「建议收藏」1. 常用的时间获取方式public class DateUtils {   /**   * 获取时间戳   * 输出结果:1438692801766   */  @Test  public void getTimeStamp() {    Date date = new Date();    long times = date.getTime();    System.o…

    2022年6月13日
    27
  • nlp 关键词提取_nlp信息抽取

    nlp 关键词提取_nlp信息抽取目录一、关键词提取概述二、TF-IDF关键词提取算法及实现三、TextRank关键词提取算法实现四、LDA主题模型关键词提取算法及实现五、Word2Vec词聚类的关键词提取算法及实现六、信息增益关键词提取算法及实现七、互信息关键词提取算法及实现八、卡方检验关键词提取算法及实现九、基于树模型的关键词提取算法及实现十、总结一、关键词提取概述关键词是能够表…

    2022年9月15日
    2
  • vue(17)vue-route路由管理的安装与配置「建议收藏」

    vue(17)vue-route路由管理的安装与配置「建议收藏」介绍VueRouter是Vue.js官方的路由管理器。它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:嵌套的路由/视图表模块化的、基于组件的路由配置路由参

    2022年7月30日
    7
  • VCLibs库文件包下载_怎么使用已有的加速包

    VCLibs库文件包下载_怎么使用已有的加速包本文以MDI应用程序为例说明如何在已有的VC++工程中使用BCG界面库,我的开发环境为VS2003。1、将BCG/BCGCBPro目录路径添加到“项目属性->C/C++->常规->附加包含目录”中,同时将BCG/Bin目录路径添加到“项目属性->链接器->常规->附加库目录”中。2、确保在CWinApp派生类(设为CMyApp)的InitInstance()成员函数中调用AfxOl

    2022年10月8日
    2

发表回复

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

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