最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js前端上傳文件縮略圖技巧示例詳解

 更新時(shí)間:2023年03月26日 14:25:14   作者:Yu_uY  
這篇文章主要為大家介紹了js前端上傳文件縮略圖技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

通常情況下,前端提交給服務(wù)器的數(shù)據(jù)格式為JSON格式,但很多時(shí)候用戶想上傳自己的頭像、視頻等,這些非文本數(shù)據(jù)的時(shí)候,就不能直接以JSON格式上傳到后端了。

當(dāng)我們要獲取用戶上傳的文件,可以使用input表單項(xiàng),將type屬性值設(shè)置為“file”。

<form action="">
    <input type="file" name="file">
</form>

同時(shí),我們?yōu)楸韱雾?xiàng)綁定change事件,當(dāng)用戶上傳文件時(shí),我們就可以在事件對(duì)象中獲取到用戶上傳的文件。

<script>
    const inp = document.querySelector("input")
    inp.onchange = function(e) {
      console.log(e.target.files);
    }
</script>

但需要注意的是 e.target.files 是一個(gè)類(lèi)數(shù)組(FileList),會(huì)將你上傳的多個(gè)文件都存儲(chǔ)在這個(gè)數(shù)組中,而這個(gè)例子中我們只上傳一個(gè)文件,所以我們用 e.target.files[0] 將這個(gè)文件對(duì)象取出來(lái)。(若想上傳多個(gè)文件,可以在input標(biāo)簽中增加multiple屬性)。

文件對(duì)象簡(jiǎn)介

在學(xué)習(xí)上傳文件前,我們先簡(jiǎn)單了解四個(gè)與文件相關(guān)的內(nèi)置對(duì)象。

Blob

Blob是一個(gè)存儲(chǔ)二進(jìn)制的對(duì)象,實(shí)際上很少直接使用這個(gè)對(duì)象。

  • size 屬性,返回Blob對(duì)象的字節(jié)數(shù),即文件的大小。
const input = document.getElementById('input');
const output = document.getElementById('output');
input.addEventListener('change', (e) => {
output.innerText = `文件的大小為${e.target.files[0].size}`;
});
  • slice() 方法,對(duì)Blob對(duì)象進(jìn)行切片,返回新的Blob對(duì)象。
  • 可以用這個(gè)方法實(shí)現(xiàn)大文件切片上傳。
var blob = new Blob().slice([start [, end [, contentType]]]};
/*
- start 開(kāi)始位置的下標(biāo)
- end 結(jié)束位置的下標(biāo)
- contentType 給新的Blob賦予一個(gè)新的文檔類(lèi)型。這將會(huì)把它的 type 屬性設(shè)為被傳入的值。它的默認(rèn)值是一個(gè)空的字符串
*/

File

  • 通常情況下, File 對(duì)象是來(lái)自用戶在一個(gè) <input> 元素上選擇文件后返回的 FileList 對(duì)象,也可以是來(lái)自由拖放操作生成的 DataTransfer 對(duì)象。
  • file 對(duì)象是Blob的一個(gè)子類(lèi),因此file對(duì)象可以直接使用Blob中的方法和屬性。
const input = document.getElementById('input');
input.addEventListener('change', (e) => {
  let file = e.target.files[0]
  if(file.size > 4 * 1024 * 1024 || file.type != "image/jpeg"){
      alert("文件不得大于4M,且圖片格式要為jpg格式。")
  }
});

FileReader

  • 異步讀取存儲(chǔ)在用戶計(jì)算機(jī)上的文件(或原始數(shù)據(jù)緩沖區(qū))的內(nèi)容,使用 File 或 Blob 對(duì)象指定要讀取的文件或數(shù)據(jù)。
var fr = new FileReader();
  • readAsDataURL(),讀取指定的 Blob 或 File 對(duì)象。讀取操作完成的時(shí)候,readyState 會(huì)變成已完成DONE,并觸發(fā) loadend 事件,同時(shí) result 屬性將包含一個(gè)data:URL 格式的字符串(base64 編碼)以表示所讀取文件的內(nèi)容。
fr.readAsDataURL(blob)
/*
- blob,被讀取的 blob 或 file對(duì)象
*/
  • readAsText(),將 Blob 或者 File 對(duì)象根據(jù)特殊的編碼格式轉(zhuǎn)化為內(nèi)容 (字符串形式)。
fr.readAsDataURL(blob)
/*
- blob,被讀取的 blob 或 file對(duì)象
*/

注意,以上兩個(gè)方法都是異步的,也就是說(shuō),只有當(dāng)執(zhí)行完成后才能夠查看到結(jié)果,如果直接查看是無(wú)結(jié)果的,并返回 undefined。我們需要為fr掛載load或loadend事件,在事件回調(diào)中使用result屬性才能獲取結(jié)果。

<input type="file" onchange="previewFile()">
<img src="" height="200">
<script>
function previewFile(e) {
  var img = document.querySelector('img');
  let file = e.target.files[0];
  let fr = new FileReader();
  reader.readAsDataURL(file);
  fr.addEventListener("load", function () {
    img.src = fr.result;
  });
}
</script>

FormData

  • 提供了一種表示表單數(shù)據(jù)的鍵值對(duì) key/value 的構(gòu)造方式。
  • <form>標(biāo)簽中,我們直接點(diǎn)擊提交按鈕,瀏覽器會(huì)以默認(rèn)以x-www-form-urlencoded的數(shù)據(jù)格式向服務(wù)器提交數(shù)據(jù)。
  • 當(dāng)我們?yōu)?code>form標(biāo)簽設(shè)置enctype屬性時(shí),可以設(shè)置發(fā)送的數(shù)據(jù)格式。
<!-- 
application/x-www-form-urlencoded 在發(fā)送前編碼所有字符(默認(rèn))
multipart/form-data  不對(duì)字符編碼。在使用包含文件上傳控件的表單時(shí),必須使用該值
text/plain           空格轉(zhuǎn)換為 "+" 加號(hào),但不對(duì)特殊字符編碼。
-->
<form action="/upload" enctype="multipart/form-data" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="file" name="file">
    <input type="submit">
</form>

在上面的例子中,瀏覽器會(huì)以formdata的數(shù)據(jù)格式向服務(wù)器發(fā)送表單數(shù)據(jù),但我們使用框架來(lái)編寫(xiě)業(yè)務(wù)時(shí),我們不會(huì)直接使用表單提交數(shù)據(jù),通常都是將表單中的數(shù)據(jù)提取出來(lái),手動(dòng)構(gòu)建出相應(yīng)的數(shù)據(jù)格式,再用aixos發(fā)送給服務(wù)器,所以我們需要主動(dòng)使用FormData對(duì)象封裝file對(duì)象

  • append() 方法,向 FormData 中添加新的屬性值,F(xiàn)ormData 對(duì)應(yīng)的屬性值存在也不會(huì)覆蓋原值,而是新增一個(gè)值,如果屬性不存在則新增一項(xiàng)屬性值。
function previewFile(e) {
    const formdata = new FormData()
    formData.append("userAvatar", e.target.files[0]);
}
/*
    第一個(gè)值為文件名稱(chēng),第二個(gè)值為要傳送的文件對(duì)象/字符串
*/

文件對(duì)象之間的關(guān)系

  • 由上圖可以看出,當(dāng)我們通過(guò)input標(biāo)簽上傳文件時(shí),我們可以得到一個(gè)file對(duì)象,file對(duì)象與blob對(duì)象可以互相轉(zhuǎn)換,但要將文件對(duì)象上傳給服務(wù)器則是不允許的,因?yàn)楹蠖藷o(wú)法識(shí)別這種對(duì)象,因此我們需要將文件對(duì)象包裝成formdata對(duì)象,或者轉(zhuǎn)換為base64等文本格式再傳給后端。
function previewFile(e) {
  let file = e.target.files[0];
  let formdata = new FormData()
  formdata.append("userAva", file)    // 注意,若要實(shí)現(xiàn)大文件分片上傳時(shí),同一個(gè)文件分片的文件名要相同,方便后端拼接
  axios.post("http://localhost/...", {
      data: formdata
  }).then( res => {
      console.log(res)
  )
}

縮略圖的實(shí)現(xiàn)

我們通過(guò)input標(biāo)簽上傳圖片后,用戶無(wú)法查看所提交的圖片。

因此為了提高用戶體驗(yàn),我們?cè)谟脩籼峤粓D片后,將圖片在頁(yè)面中顯示出來(lái)。

<form action="">
  <input type="file" name="file"><br/>
  <img src="" alt="">
</form>
<script>
  const inp = document.querySelector("input")
  const img = document.querySelector("img")
  const fr = new FileReader()
  inp.onchange = function(e) {
    let file = e.target.files[0]
    fr.readAsDataURL(file)
  }
  fr.onload = function() {
    img.src = fr.result
  }
</script>

未提交前

提交后

總結(jié)

  • 前端上傳文件時(shí)需要使用FormData對(duì)象對(duì)文件進(jìn)行包裝后才能傳給服務(wù)器。
  • 獲取用戶上傳的圖片后,使用FileReader對(duì)象中提供的readAsDataUrl()方法,將圖片轉(zhuǎn)化為base64格式,再將base64編碼讓img標(biāo)簽加載,實(shí)現(xiàn)縮略圖的效果。

以上就是js前端上傳文件縮略圖技巧示例詳解的詳細(xì)內(nèi)容,更多關(guān)于js前端上傳文件縮略圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 微信小程序數(shù)字滾動(dòng)插件使用詳解

    微信小程序數(shù)字滾動(dòng)插件使用詳解

    這篇文章主要介紹了微信小程序數(shù)字滾動(dòng)插件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • JavaScript實(shí)現(xiàn)即時(shí)通訊的 4 種方案

    JavaScript實(shí)現(xiàn)即時(shí)通訊的 4 種方案

    這篇文章主要給大家分享了JavaScript實(shí)現(xiàn)即時(shí)通訊的 4 種方案,其實(shí)就是服務(wù)端如何將數(shù)據(jù)推送到瀏覽器,下面詳細(xì)的文章內(nèi)容,需要的小伙伴參考一下,洗碗給對(duì)你有所幫助
    2022-02-02
  • js實(shí)現(xiàn)幻燈片輪播圖

    js實(shí)現(xiàn)幻燈片輪播圖

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)幻燈片輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JavaScript實(shí)現(xiàn)獲取網(wǎng)絡(luò)通信進(jìn)度

    JavaScript實(shí)現(xiàn)獲取網(wǎng)絡(luò)通信進(jìn)度

    這篇文章主要為大家詳細(xì)介紹了如何使用Fetch?API和XMLHttpRequest(XHR)來(lái)執(zhí)行網(wǎng)絡(luò)請(qǐng)求,并重點(diǎn)說(shuō)明如何獲取這兩種方法的網(wǎng)絡(luò)請(qǐng)求進(jìn)度,感興趣的可以了解下
    2023-12-12
  • JavaScript常用數(shù)組去重實(shí)戰(zhàn)源碼

    JavaScript常用數(shù)組去重實(shí)戰(zhàn)源碼

    本文給大家分享js常用8種數(shù)組去重實(shí)戰(zhàn)源碼,針對(duì)每種方法通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • JS常用的幾種數(shù)組遍歷方式以及性能分析對(duì)比實(shí)例詳解

    JS常用的幾種數(shù)組遍歷方式以及性能分析對(duì)比實(shí)例詳解

    這篇文章主要介紹了JS常用的幾種數(shù)組遍歷方式以及性能分析對(duì)比,結(jié)合實(shí)例形式詳細(xì)分析了javascript針對(duì)數(shù)組遍歷的幾種常見(jiàn)使用方法及執(zhí)行效率對(duì)比,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2018-04-04
  • 基于JavaScript打造一款桌面級(jí)便簽系統(tǒng)

    基于JavaScript打造一款桌面級(jí)便簽系統(tǒng)

    本文將用html,css和JavaScript實(shí)現(xiàn)一個(gè)簡(jiǎn)單的便簽系統(tǒng)。除非手動(dòng)清空便簽,否則便簽會(huì)一直保留,非常方便。感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試
    2022-02-02
  • JavaScript進(jìn)階(二)詞法作用域與作用域鏈實(shí)例分析

    JavaScript進(jìn)階(二)詞法作用域與作用域鏈實(shí)例分析

    這篇文章主要介紹了JavaScript詞法作用域與作用域鏈,結(jié)合實(shí)例形式分析了JavaScript詞法作用域與作用域鏈相關(guān)概念、原理與操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • JavaScript本地存儲(chǔ)實(shí)現(xiàn)用戶名存儲(chǔ)案例

    JavaScript本地存儲(chǔ)實(shí)現(xiàn)用戶名存儲(chǔ)案例

    本文主要介紹了JavaScript本地存儲(chǔ)實(shí)現(xiàn)用戶名存儲(chǔ)案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • WebGL 顏色與紋理使用介紹

    WebGL 顏色與紋理使用介紹

    這篇文章主要為大家介紹了WebGL 顏色與紋理使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論

怀安县| 久治县| 清苑县| 汝阳县| 乐昌市| 临泽县| 金坛市| 阜新市| 龙井市| 漠河县| 彰化市| 察隅县| 晋州市| 信阳市| 泌阳县| 长汀县| 内丘县| 慈利县| 财经| 监利县| 湖北省| 洞头县| 丰顺县| 鄂托克前旗| 大兴区| 浦县| 靖州| 雅安市| 屯留县| 松阳县| 丹东市| 德保县| 密云县| 保德县| 延寿县| 曲阜市| 海晏县| 饶河县| 太湖县| 宣威市| 阜南县|