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

JS獲取本地文件并進行網(wǎng)絡(luò)傳輸?shù)拇a詳解

 更新時間:2024年08月07日 11:50:48   作者:xump  
在web中如想要獲取用戶計算機上的文件我們通常會用到的方法是通過一個表單元素<input type="file">操作用戶選擇的文件,本文小編給大家介紹了JS獲取本地文件并進行網(wǎng)絡(luò)傳輸?shù)姆椒?需要的朋友可以參考下

獲取文件

在web中如想要獲取用戶計算機上的文件我們通常會用到的方法是通過一個表單元素<input type="file">操作用戶選擇的文件。

我們可以在js中通過監(jiān)聽該元素的change事件獲取到文件信息,通常文件會被存放在該元素的files集合中,例如:

<input type="file">
<script>
    const files = document.querySelector('input');
    files.addEventListener('change',(e)=>{
        console.log(e.target.files);
    })
</script>

File對象

File對象中主要有以下幾個常用的屬性,并且都是只讀屬性。

  • name:在系統(tǒng)中的文件名。
  • size:文件大?。▎挝粸樽止?jié))。
  • type:文件的MIME類型。
  • lastModified:文件最后修改時間。

通過我們可以通過這些文件的基本信息對選擇的文件進行基本的過濾或是驗證,例如:

function validateFile(file){
    const maxSize = 1 * 1024 * 1024;
    const types = ['.jpg','.jpeg','.png','.bmp','.webp','.gif'];
    const fileName = file.name.toLowerCase();
    if(file.size > maxSize){
        alert('文件過大!');
        return false;
    }
    if(!types.some((item)=>fileName.endsWith(item))){
        alert('文件類型不匹配!');
        return false;
    }
    return true;
}
files.addEventListener('change',(e)=>{
    if(!validateFile(e.target.files[0])){
        e.target.value = '';
        return;
    }
    // 后續(xù)操作...
})

在以上代碼中我們通過一個函數(shù)來判斷我們選擇的一個文件是否符合要求以進行下一步操作,主要通過file對象上的屬性判斷了文件的大小和類型是否符合要求,通過不同函數(shù)我們可以過濾掉不符合我們預(yù)期的文件。

File對象上是不包含文件的內(nèi)容信息的,但通常情況下我們獲取到File對象上文件信息的目的是要讀取到真實的文件數(shù)據(jù)信息,這時候就要借助另一個API:FileReader。

FileReader

FileReader是js中提供用于讀取文件數(shù)據(jù)的API,它可以從本地文件系統(tǒng)中讀取文件數(shù)據(jù),其讀取過程是異步進行的。

FileReader對象的常用方法:

  • readAsDataURL:這個方法可以讀取文件并將其內(nèi)容數(shù)據(jù)轉(zhuǎn)化為數(shù)據(jù)URL,結(jié)果存儲到FileReader實例的result屬性上。
  • readAsText:讀取文件的純文本內(nèi)容,同樣結(jié)果存儲到FileReader實例的result屬性上。
  • readAsBinaryString:讀取文件的二進制信息,同樣結(jié)果存儲到FileReader實例的result屬性上。

由于讀取文件的過程是異步的,所以我們主要是通過FileReader提供的監(jiān)聽事件來獲取文件的信息,常用的事件有三個:

  • load:文件成功加載后觸發(fā),此時可以通過result屬性獲取到文件信息。
  • progress:文件讀取進度信息,每50ms觸發(fā)一次,屬性與XHR中的類似。
  • error:文件讀取出錯時觸發(fā),若error事件觸發(fā)則load事件將不會觸發(fā)。在error觸發(fā)后可以通過實例上的error屬性獲取到錯誤信息,其包含一個信息碼,代表的意思分別是:1(未找到文件)、2(安全錯誤)、3(讀取被中斷)、4(文件不可讀)、5(編碼錯誤)。

假設(shè)我們需要讀取一張圖片然后顯示到頁面中我們就可以進行如下操作:

const files = document.querySelector('input');
const img = document.querySelector('img');
files.addEventListener('change',(e)=>{
    let file = e.target.files[0];
    // 驗證文件基本信息
    if(!validateFile(file)){
        e.target.value = '';
        return;
    }
    let reader = new FileReader();
    reader.readAsDataURL(file); // 讀出文件信息并轉(zhuǎn)化為URL
    reader.addEventListener('load',(e)=>{
        console.log('文件加載完成');
        img.src = e.target.result; // 將URL賦予img元素,此時e.target為reader
    })

})

文件上傳

當(dāng)我們在客戶端獲取到了文件后我們又將如何將文件上傳呢?將文件上傳至服務(wù)器,這必然就涉及到了網(wǎng)絡(luò)通信,而在js中進行網(wǎng)絡(luò)通信那自然就會用到ajax了。

利用XHR進行文件上傳

進行網(wǎng)絡(luò)通信,我們只要想到組成一個http報文就自然而然的指定該如何編寫代碼了,http請求主要包含了請求行、請求頭、請求體三部分信息。例如我需要實現(xiàn)以下http報文:

POST /upload HTTP/1.1
Host:127.0.0.1:5000
Content-Type: multipart/form-data;boundary=xxx

---xxx
Content-Disposition:form-data; name="xxhh";filename="bg.jpg"
Content-Type:image/jpeg

文件數(shù)據(jù)...
--xxx--

我們就可以通過以下js進行實現(xiàn)

const xhr = new XMLHttpRequest();
xhr.open('POST','http://127.0.0.1:5000/upload');
const form = new FormData();
form.append('xxhh',file,'bg.jpg');
// 第一個參數(shù)對應(yīng)Content-Disposition中的name
// 第二個參數(shù)為文件數(shù)據(jù)(這里是文件真實的數(shù)據(jù)并非File對象)
// 第三個為Content-Disposition中的filename,默認(rèn)為本地文件名
xhr.send(form);
xhr.onload = ()=>{
    console.log(xhr.responseText); //獲取到響應(yīng)結(jié)果
}

我們通過open構(gòu)造出請求頭信息,并通過FormData這個API讓我們更加簡單的編寫請求體信息, 它會自動將我們的請求頭信息設(shè)置為Content-Type: multipart/form-data;并自動生成一個boundary,使用append方法可向其添加一個要發(fā)送字段信息,最后調(diào)用xhr.send(form)將攜帶數(shù)據(jù)的請求發(fā)出。

以上就是JS獲取本地文件并進行網(wǎng)絡(luò)傳輸?shù)拇a詳解的詳細(xì)內(nèi)容,更多關(guān)于JS獲取本地文件并傳輸?shù)馁Y料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 微信小程序自定義可滑動日歷界面

    微信小程序自定義可滑動日歷界面

    這篇文章主要為大家詳細(xì)介紹了微信小程序自定義可滑動日歷界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • JS中try-catch異常處理機制詳解(結(jié)合?async/await)

    JS中try-catch異常處理機制詳解(結(jié)合?async/await)

    這篇文章主要介紹了JS中try-catch異常處理機制(結(jié)合?async/await)的相關(guān)資料,try...catch語句將能引發(fā)錯誤的代碼放在try塊中,并且對應(yīng)一個響應(yīng),然后有異常被拋出,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01
  • JS 事件冒泡 示例代碼

    JS 事件冒泡 示例代碼

    JS 事件冒泡 示例代碼,大家可以參考下。
    2009-07-07
  • 模擬彈出菜單的代碼

    模擬彈出菜單的代碼

    模擬彈出菜單的代碼...
    2007-08-08
  • 前端如何監(jiān)聽手機鍵盤是否彈起示例詳解

    前端如何監(jiān)聽手機鍵盤是否彈起示例詳解

    實際應(yīng)用中我們會遇到監(jiān)聽按鍵輸入和鼠標(biāo)點擊事件,這篇文章主要介紹了前端如何監(jiān)聽手機鍵盤是否彈起的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • js常用函數(shù)2008-8-16整理

    js常用函數(shù)2008-8-16整理

    方便使用js的朋友,把下面的函數(shù)找到你想要的功能函數(shù),復(fù)制部分判斷輸入文本是否為身份證號碼,如為不正確則提示
    2008-08-08
  • JavaScript、C# URL編碼、解碼總結(jié)

    JavaScript、C# URL編碼、解碼總結(jié)

    這篇文章主要介紹了JavaScript、C# URL編碼總結(jié),注意包括了encodeURI、decodeURI、encodeURIComponent、decodeURIComponent等使用需要的朋友可以參考下
    2017-01-01
  • JavaScript防抖與節(jié)流詳解

    JavaScript防抖與節(jié)流詳解

    防抖是一種?優(yōu)化高頻觸發(fā)事件?的技術(shù),其核心思想是在事件被頻繁觸發(fā)時,只有最后一次操作會被執(zhí)行,中間的觸發(fā)會被忽略,本文給大家介紹JavaScript防抖與節(jié)流知識,感興趣的朋友一起看看吧
    2025-10-10
  • JS表格的動態(tài)操作完整示例

    JS表格的動態(tài)操作完整示例

    這篇文章主要介紹了JS表格的動態(tài)操作,結(jié)合完整實例形式詳細(xì)分析了JavaScript針對表格元素的動態(tài)修改與刪除簡單操作技巧,需要的朋友可以參考下
    2020-01-01
  • 自己動手寫的javascript前端等待控件

    自己動手寫的javascript前端等待控件

    等待控件在網(wǎng)上搜有好多種,但是都很復(fù)雜,不一定用的順手,再說我的項目是bootstrap的原因,又不敢輕易使用第三方控件,怕不兼容,于是自己動手寫了個等待控件,有需要的朋友可以參考下
    2015-10-10

最新評論

教育| 北碚区| 望城县| 徐水县| 苏尼特左旗| 武汉市| 肇源县| 灵丘县| 泰顺县| 哈密市| 商水县| 雷山县| 兖州市| 舟曲县| 潍坊市| 茶陵县| 延长县| 静宁县| 深水埗区| 获嘉县| 咸宁市| 潼南县| 临沧市| 布尔津县| 汉川市| 无为县| 康平县| 汾西县| 乌鲁木齐县| 彩票| 开阳县| 湘潭县| 汾阳市| 乐昌市| 丹东市| 留坝县| 襄汾县| 岳阳市| 赤水市| 环江| 丹江口市|