您的位置:

AJAX上传图片详解

一、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上传图片是一种无需刷新页面即可上传图片的技术,它可以提高用户体验和减轻服务器压力。