图片上传至服务器方法:



(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);
					});
			}