二进制图片数据上传至服务器

本文介绍了图片上传至服务器的两种常见方法:Base64编码和二进制格式。Base64编码虽然简单但会增加数据量,适合小图片传输;二进制格式保持原数据大小,适用于大文件上传。文中提供了JavaScript实现的代码示例,包括将图片转化为Base64和二进制,以及使用Ajax和axios进行上传。
摘要由CSDN通过智能技术生成

图片上传至服务器方法:


(1)使用form表单上传
(2)使用ajax中的formdata格式上传
(3)将图片转为base64格式数据上传
(4)将图片转为二进制格式数据上传


由于form表单和ajax的formdata格式上传数据的灵活性不强,在此只介绍后两种方式。

1.将图片转为base64

图片转为base64后,因其编码格式特殊(将每三个字节拆分成四个字节),会使图片大小变为原来的4/3(清晰度不会发生任何变化),与二进制数据表示图片相比,这在上传较大图片以及较多图片时会占用较多的内存空间。因而不建议直接将base64格式的数据上传至服务器。


代码如下:

function imagetobase64(){
		var file = document.getElementById(‘filename’).files[0];
		//创建file对象,获取页面中名为filename的input标签中的图片文件
		var reader = new FileReader();
		//创建FileReader类型对象reader
		reader.readAsDataURL(file);
		//用reader对象将file图片对象中的数据转为base64格式数据
		reader.onload = function(event){
				console.log(event.target.result);
				//输出转换后数据
		}
}

若需要将base64格式的数据上传至服务器,只需要将其以文本格式发送即可

2.将图片转为二进制格式上传

图片转为二进制格式后,数据不会发生任何大小上的改变,因而在图片的传输上建议使用该方法


(1)图片转换二进制,代码如下:

function clickb() {
		var file = document.getElementById('filese').files[0];
		//获取id为filese的input标签中的文件
		var reader = new FileReader();
		//创建FileReader对象
		reader.readAsArrayBuffer(file);
		//利用reader对象将file文件转为二进制数组ArrayBuffer
		reader.onload = function(event) {
				console.log(event.target.result);
		}
	}

注意,ArrayBuffer类型数组与普通数组不同,其是固定长度的原始二进制缓冲区,并且不能够直接操作ArrayBuffer中的内容,需要通过类型数组对象或DataView对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。


(2)用Ajax上传二进制数据,代码如下:

function clickb() {
		var file = document.getElementById('filese').files[0];
		var reader = new FileReader();
		reader.readAsArrayBuffer(file);
		reader.onload = function(event) {
			var http = new XMLHttpRequest();
			var url = 'http://localhost:8080/LKKL/NN';
			http.open('POST', url, true);
			http.responseType = 'arraybuffer';
			/* 注意,当获取后端数据为二进制字节byte时,必须设置responseType类型为arraybuffer,
			(如果后端发送的数据是二进制,用默认responseType会将接收到的二进制转为字符串,导致
			后期二进制转图片时生成乱码,无法生成正常图像)且该类型设置必须在该ajax对象设为异步
			(即http.open()方法的第三个参数设为true)之后,否则报错 */
			http.onreadystatechange = function() {
				if (http.readyState == 4) {
					var img = document.createElement('img');
					var datas = ArrayBufferToBase64(http.response);
					//利用下方的函数将接收到的ArrayBuffer转为base64
					img.src = "data:image/png;base64," + datas;
					//转换后的base64并不能直接用于图片的src,需要加上"data:image/png;base64,"
					document.getElementById('sss').appendChild(img);
				}
			}
			http.send(this.result);
		}
	}

function ArrayBufferToBase64(buffer) {
		//第一步,将ArrayBuffer转为二进制字符串
		var binary = '';
		var bytes = new Uint8Array(buffer);
		for (var len = bytes.byteLength, i = 0; i < len; i++) {
			binary += String.fromCharCode(bytes[i]);
		}
		//将二进制字符串转为base64字符串
		return window.btoa(binary);
		/* btoa()方法用于将字符串解析为base64数据,因js不能(或者很难)将二进制直接转为图片,
		所以在此将base64作为中介,上传和下载都采用二进制,前端显示图片只需要使用btoa()方法将
		接收到的二进制数据转为base64格式,注意:base64格式如果想要显示为图片,需要在转换后的
		数据前加上"data:image/png;base64," */
			}


(3)用axios上传二进制数据,代码如下:

	var file = document.getElementById('filess').files[0];
	var reader = new FileReader();
	reader.readAsArrayBuffer(file);
	reader.onload = function(event){
	axios({
			method:'post',
			url:'http://localhost:8080/LKKL/NN',
			data:event.target.result,
			responseType:'arraybuffer'
			}).then(
					(response)=>{
							var img = document.createElement('img');
							var array = new Uint8Array(response.data);
							var datas = '';
							for(var i = 0;i<array.length;i++){
									datas += String.fromCharCode(array[i]);
							}
							var p = btoa(datas);
							img.src = 'data:image/png;base64,'+p;
							document.getElementById('a').appendChild(img);
					});
			}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值