一、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上传图片是一种无需刷新页面即可上传图片的技术,它可以提高用户体验和减轻服务器压力。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/258078.html
微信扫一扫
支付宝扫一扫