js實(shí)現(xiàn)多圖和單圖上傳顯示
項(xiàng)目中經(jīng)常會(huì)大量的使用到圖片上傳,之前涉及到的時(shí)候經(jīng)常會(huì)在網(wǎng)上下載一些素材直接拿過來使用,但是隨著項(xiàng)目的增多發(fā)現(xiàn)用的是各式各樣的,導(dǎo)致非?;靵y。所以抽空寫了一個(gè)DEMO來梳理下圖片上傳的流暢以及單圖和多圖上傳需要注意的點(diǎn)。
多圖上傳
多圖上傳,這里僅僅是做了前端的展示效果,實(shí)際項(xiàng)目中,多圖上傳應(yīng)該是每次上傳一張圖片后向后臺發(fā)送一次請求,后臺返回img路徑然后進(jìn)行展現(xiàn)。
為什么一定要傳入后臺在進(jìn)行展現(xiàn)呢?
1.如果直接在前臺先展現(xiàn)base64圖片路徑,在向后臺發(fā)送請求。如果接口出現(xiàn)錯(cuò)誤后,會(huì)給用戶產(chǎn)生錯(cuò)覺,以為圖片上傳成功,而這時(shí)后臺是沒有接收到圖片的;
2.file文件每次發(fā)生變化,會(huì)將之前的files文件給覆蓋掉。如果直接展現(xiàn)不用ajax提交后,最終用form提交只會(huì)提交最后一張。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>多圖上傳/單圖上傳</title>
<style>
*{
margin: 0;
padding: 0;
}
.box{
width: 1000px;
height: 120px;
margin: 0 auto;
border: 1px solid #ddd;
margin-top: 20px;
box-sizing: border-box;
padding: 10px;
}
.upload{
width: 100px;
height: 100px;
float: left;
position: relative;
overflow: hidden;
}
.upload input{
position: absolute;
z-index: 1000;
top:0;
left:0;
width: 100%;
height: 100%;
opacity: 0;
}
.upload a{
display: block;
width: 100%;
}
.upload img{
display: block;
width: 100%;
height: 100%;
}
.imgList{
float: left;
overflow: hidden;
}
.imgList .item{
width: 100px;
height: 100px;
margin-right: 20px;
float: left;
position: relative;
}
.imgList .item img{
display: block;
width: 100%;
height: 100%;
}
.imgList .item span{
position: absolute;
top: 0;right: 0;
width: 100%;
background: red;
color:#fff;
height: 20px;
width: 20px;
text-align: center;
border-radius: 50%;
cursor: pointer;
}
</style>
</head>
<body>
<div class="box">
<!-- 放圖片的位置 -->
<div class="imgList" id="imgList"></div>
<!-- 上傳按鈕 -->
<div class="upload">
<input type="file" name="file" value="" multiple accept="image/*" onchange="uploadImg(this);">
<a href="javascript:void(0)" rel="external nofollow" ><img src="z_add.png" alt=""></a>
</div>
</div>
<script>
function uploadImg(obj){
var files = obj.files;//獲取上傳文件后的fileList
var imgList = [];//聲明空數(shù)組用來接收上傳完成后的圖片
for(var i = 0; i<files.length;i++){
var imgUrl = window.URL.createObjectURL(files[i]);//將文件轉(zhuǎn)換成base64 URL格式
imgList.push(imgUrl);//將url壓入到數(shù)組中 **如果需要圖片統(tǒng)一選擇完畢后,點(diǎn)擊上傳按鈕統(tǒng)一提交,那么直接拿這imgList給后臺傳遞即可。**
// 循環(huán)創(chuàng)建img容器用來放置url在頁面上顯示
var img = document.createElement('img')
img.setAttribute("src", imgList[i]);
//刪除按鈕
var close = document.createElement('span')
close.innerHTML="x"
close.className='close'
close.setAttribute('onclick',"imgRemove(this)")
//創(chuàng)建放置img的盒子
var item = document.createElement('div');
item.className='item';
item.append(img)
item.append(close)
var box = document.getElementById("imgList");
box.append(item);
//ajax向后臺發(fā)送請求
}
}
//刪除代碼
function imgRemove(obj){
obj.parentNode.remove()
}
</script>
</body>
</html>
單圖上傳
去掉input中的multiple 屬性就變成了單圖上傳;
<input type="file" name="file" value="" accept="image/*" onchange="uploadImg(this);">
按照上邊的代碼直接就可以實(shí)現(xiàn)單圖上傳和多圖上傳。下邊在說下單圖上傳和多圖上傳提交需要注意的;
1.單圖上傳可以跟隨form表單一起提交,給input一個(gè)name值后臺就可以提交過去;
2.多圖上傳不可以跟form一起提交,因?yàn)槊看紊蟼骱骹ile只會(huì)保留最新的;可以先通過ajax將圖片提交成功后,在form內(nèi)去循環(huán)創(chuàng)建隱藏的input將后臺返回的路徑設(shè)置成改input的val值最后跟隨form提交;需要注意隱藏的input的name值寫成[]形式,比如:name=“img[]”。這樣在form提交的時(shí)候后臺就可以接受到所有的圖片;
以上的代碼,適用于前端點(diǎn)擊file上傳圖片后的顯示。具體與后臺的一些交互可以根據(jù)實(shí)際項(xiàng)目中的需求進(jìn)行增加!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js實(shí)現(xiàn)圖片上傳并正常顯示
- JSP中圖片的上傳與顯示方法實(shí)例詳解
- 圖片上傳即時(shí)顯示縮略圖的js代碼
- jsp中實(shí)現(xiàn)上傳圖片即時(shí)顯示效果功能
- 上傳圖片時(shí)JS自動(dòng)顯示圖片
- JS實(shí)現(xiàn)批量上傳文件并顯示進(jìn)度功能
- JS插件plupload.js實(shí)現(xiàn)多圖上傳并顯示進(jìn)度條
- 利用jsp+Extjs實(shí)現(xiàn)動(dòng)態(tài)顯示文件上傳進(jìn)度
- PHP + plupload.js實(shí)現(xiàn)多圖上傳并顯示進(jìn)度條加刪除實(shí)例代碼
- js兼容火狐顯示上傳圖片預(yù)覽效果的方法
相關(guān)文章
javascript面向?qū)ο笾L問對象屬性的兩種方式分析
這篇文章主要介紹了javascript面向?qū)ο笾L問對象屬性的兩種方式分析,實(shí)例分析了直接訪問對象屬性的方式與數(shù)組訪問方式,需要的朋友可以參考下2015-01-01
微信小程序全局變量改變監(jiān)聽的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于微信小程序全局變量改變監(jiān)聽的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用微信小程序具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
JavaScript基于querySelector?/?querySelectorAll對元素的操作(DOM?AP
這篇文章主要介紹了JavaScript基于querySelector?/?querySelectorAll對元素的操作(DOM?API掃盲),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
uni-app調(diào)取接口的3種方式以及封裝uni.request()詳解
我們在實(shí)際工作中要將數(shù)據(jù)傳輸?shù)椒?wù)器端,從服務(wù)器端獲取信息,都是通過接口的形式,下面這篇文章主要給大家介紹了關(guān)于uni-app調(diào)取接口的3種方式以及封裝uni.request()的相關(guān)資料,需要的朋友可以參考下2022-08-08
webapi根據(jù)id獲取元素的實(shí)現(xiàn)思路
掌握document.getElementById() 根據(jù)id獲取元素,在頁面畫出一個(gè)寬200 高200 粉色的盒子, 在控制臺打印這個(gè)盒子,接到這樣的需求如何處理呢,下面小編給大家分享webapi根據(jù)id獲取元素的實(shí)現(xiàn)思路,感興趣的朋友一起看看吧2024-02-02
VSCode 添加自定義注釋的方法(附帶紅色警戒經(jīng)典注釋風(fēng)格)
這篇文章主要介紹了VSCode 添加自定義注釋的方法(附帶紅色警戒經(jīng)典注釋風(fēng)格),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
JS中函數(shù)科里化的背景與應(yīng)用實(shí)例教程
在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中,柯里化是一種將使用多個(gè)參數(shù)的一個(gè)函數(shù)轉(zhuǎn)換成一系列使用一個(gè)參數(shù)的函數(shù)的技術(shù),下面這篇文章主要給大家介紹了JS中函數(shù)科里化的背景與應(yīng)用實(shí)例的相關(guān)資料,需要的朋友可以參考下2022-06-06

