一、AJAX上传图片简介
AJAX上传图片是一种无需刷新页面即可上传图片的技术。它简化了上传图片的流程,提高了用户体验,同时也减轻了服务器压力。下面将介绍AJAX上传图片的实现方式和相关细节。
二、AJAX上传图片的实现方式
首先,需要在HTML页面中添加一个input标签,用于选择要上传的图片。然后,通过JavaScript代码,获取到input标签的值,并使用AJAX技术将图片上传到服务器。
具体实现方式如下:
//HTML代码 <input type="file" id="image" name="image"> //JavaScript代码 var input = document.getElementById('image'); var file = input.files[0]; var formData = new FormData(); formData.append('image', file); var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(formData);
上述代码片段中,首先使用document.getElementById()方法获取input标签元素,进而获取上传的图片文件。接着,创建FormData对象并将文件添加进去,从而实现了将文件上传到服务器的目的。最后,使用XMLHttpRequest对象进行异步上传,当上传成功后,打印服务器返回的响应信息。
三、AJAX上传图片的相关细节
1. 显示上传进度条
为了提高用户体验,我们通常会在上传图片的过程中显示进度条。要实现进度条,需要使用XMLHttpRequest对象的upload属性获取上传过程的状态,并在相应的状态下更新进度条。
具体实现方式如下:
//HTML代码 <progress id="progress" value="0" max="100"></progress> //JavaScript代码 var input = document.getElementById('image'); var file = input.files[0]; var formData = new FormData(); formData.append('image', file); var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true); xhr.upload.onprogress = function(event) { var progress = document.getElementById('progress'); progress.value = Math.round(event.loaded / event.total * 100); }; xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(formData);
上述代码片段中,使用progress标签显示进度条,使用XMLHttpRequest对象的upload属性监听上传过程中状态的变化,并在状态响应的回调函数中更新进度条的值。
2. 压缩上传的图片
在计算机上选择的图片文件可能会很大,在上传之前需要对其进行压缩,以减小上传时间和占用服务器存储空间。
可以使用canvas的toDataURL()方法将图片压缩为Base64编码格式,从而缩小图片大小。具体实现方式如下:
//HTML代码 <input type="file" id="image" name="image"> //JavaScript代码 var input = document.getElementById('image'); var file = input.files[0]; var img = new Image(); img.onload = function() { var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); canvas.width = 200; canvas.height = img.height * canvas.width / img.width; ctx.drawImage(img, 0, 0, canvas.width, canvas.height); var dataURL = canvas.toDataURL('image/jpeg'); var blobData = dataURLtoBlob(dataURL); var formData = new FormData(); formData.append('image', blobData); var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(formData); }; img.src = URL.createObjectURL(file); function dataURLtoBlob(dataURL) { var arr = dataURL.split(','); var mime = arr[0].match(/:(.*?);/)[1]; var bstr = atob(arr[1]); var n = bstr.length; var u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], { type: mime }); }
上述代码片段中,首先创建Image对象并将其源属性设置为选择的图片,用于获得图片的原始大小。接着,创建Canvas对象并将图片绘制在画布上。通过设置Canvas对象的宽度和高度,可以缩放图片并压缩尺寸。使用toDataURL()方法将图片转换为Base64编码格式,并将其转换为Blob格式的数据用于上传。最后,使用XMLHttpRequest对象进行异步上传,当上传成功后,打印服务器返回的响应信息。
3. 获取已上传的图片
在上传完成后,需要获取已上传的图片进行展示或其他操作。可以通过服务器返回的URL地址获取。同时,为了防止重复上传相同的图片,可以使用缓存机制来存储URL地址,从而避免重复上传。
//服务器返回的响应信息 { "code": 0, "data": { "url": "http://example.com/upload/image.jpg" } } //JavaScript代码 var input = document.getElementById('image'); var file = input.files[0]; var key = file.name; var cache = JSON.parse(localStorage.getItem('cache')) || {}; if (cache[key]) { console.log(cache[key]); return; } var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var response = JSON.parse(xhr.responseText); if (response.code === 0) { var url = response.data.url; console.log(url); cache[key] = url; localStorage.setItem('cache', JSON.stringify(cache)); } } }; xhr.send(formData);
上述代码片段中,首先获取要上传的图片名称作为缓存的键值。接着,从本地存储中获取缓存对象。如果该图片已上传并被缓存,则直接使用缓存的URL地址,否则,上传该图片并将其URL地址存入缓存中。最后,打印URL地址和缓存对象。
四、总结
本文介绍了AJAX上传图片的实现方式和相关细节,包括上传进度条、压缩上传的图片和获取已上传的图片。AJAX上传图片是一种无需刷新页面即可上传图片的技术,它可以提高用户体验和减轻服务器压力。