一、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/zh-hk/n/258078.html
微信掃一掃
支付寶掃一掃