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

input的accept屬性讓文件上傳安全高效

 更新時間:2025年12月06日 11:11:01   作者:@大遷世界  
文章介紹了HTML的input文件上傳`accept`屬性在文件上傳校驗(yàn)中的重要性和優(yōu)勢,通過使用`accept`屬性,可以減少前端JavaScript的復(fù)雜性,提高用戶體驗(yàn),并且在大多數(shù)主流瀏覽器中都有很好的支持

前言

大部分前端開發(fā),一提到“文件上傳校驗(yàn)”,腦子里立刻蹦出三件事:

  • 校驗(yàn) MIME 類型

  • 校驗(yàn)文件大小

  • 再加一堆出錯提示、兜底邏輯、邊界處理

然后——自然地把這些事全扔給 JavaScript。

看起來很專業(yè),對不對?直到有一天,我上傳了一個文件,還沒等它到后端,就被自己前端邏輯搞崩了。

于是我開始往代碼里瘋狂加條件、加雙重判斷、加“測試用特例”, 結(jié)果越補(bǔ)越亂,越寫越心虛。

也就是在那段時間,我無意間翻出一個自己“從來沒當(dāng)回事”的 HTML 小特性。

這個小東西,直接改變了我處理文件上傳的方式。

今天就把這個發(fā)現(xiàn),從頭講給你聽。

那個悄悄毀掉你上傳體驗(yàn)的“常見寫法”

大部分人處理上傳,基本都是這樣寫:

<input type="file" id="ImageUpload" />

然后再配套一段 JavaScript 做校驗(yàn):

const fileInput = document.getElementById('ImageUpload');

fileInput.addEventListener('change', (e) => {
  const inputFile = e.target.files[0];

  if (!inputFile.type.startsWith("image/")) {
    alert("You can upload only images.");
  }
});

寫完之后,內(nèi)心是有點(diǎn)成就感的:

“你看,我可以提示用戶:你選錯文件類型啦~”

但問題來了:

  • 用戶 已經(jīng)點(diǎn)了按鈕

  • 已經(jīng)打開系統(tǒng)文件選擇器

  • 已經(jīng)在一大堆文件里翻來翻去

  • 已經(jīng)選好了一個文件

然后你跳出來說:

“不行哦,這個傳不上來。”

這就是典型的——事后教育式交互。 拖慢體驗(yàn)不說,錯誤率還高得離譜。

更扎心的是: 即便你寫了這段 JavaScript 校驗(yàn), 依然會遇到各種奇奇怪怪的測試樣例:

  • MIME 類型標(biāo)錯的文件

  • 看起來是 image,實(shí)則不是圖片

  • 隨便起了個后綴的二進(jìn)制垃圾文件

  • 把 PDF 假裝成 PNG 的偽裝文件

也就是說:

你費(fèi)勁寫了一堆前端驗(yàn)證, 但它既攔不住真高手,也常常在煩普通用戶。

直到我遇見今天的主角。

改變一切的 HTML 小特性:accept

我說的就是這個東西:

<input type="file" accept="image/*" />

一個幾乎所有人都見過、 卻沒幾個人認(rèn)真用過的屬性:**accept**。

它小到只有幾個字符, 但給上傳體驗(yàn)帶來的改變,是維度級別的:

  • 在文件選擇器里,自動隱藏所有不支持的文件

  • 用戶甚至 看不到錯誤類型可以選

  • 自動根據(jù) MIME 類型和后綴做過濾

  • 兼容一大堆后臺規(guī)定和瀏覽器格式細(xì)節(jié)

  • 能輕松幫你砍掉 50%–60% 的上傳校驗(yàn)代碼

一句話:

用戶選不到錯的文件, 你就少寫一半“事后罵人”的 JavaScript。

真正的魔法:讓用戶一開始就沒機(jī)會選錯

當(dāng)你這么寫:

<input type="file" accept="image/*" />

接下來會發(fā)生什么?

  • 用戶點(diǎn)擊上傳按鈕

  • 打開系統(tǒng)的選文件窗口

  • 窗口里只會展示“被認(rèn)定為圖片”的文件

  • 諸如 PDF、DOC、亂七八糟的其他格式,統(tǒng)統(tǒng)隱藏

在這個階段, 你的 JavaScript 甚至還沒出場, 用戶就已經(jīng)被溫柔地“攔在正確的范圍里”。

如果你要上傳的是 PDF 呢?

<input type="file" accept="application/pdf" />

再復(fù)雜一點(diǎn),比如: 你想允許用戶上傳 多種類型:圖片 + PDF:

<input type="file" accept=".png, .jpg, .jpeg, .pdf" />

只想要視頻?

<input type="file" accept="video/*" />

只要音頻?

<input type="file" accept="audio/*" />

只要 Office 文件(Word / Excel / PPT)?

<input type="file" accept=".docx, .xlsx, .pptx" />

這些全都只是 HTML 在幫你干活。 你甚至不需要寫一行 JS, 就能把 90% 的“明顯錯誤文件”擋在門外。

那如果我需要更精細(xì)的控制呢?

當(dāng)然,現(xiàn)實(shí)項(xiàng)目里,你往往不只關(guān)心“格式對不對”。 比如:

“必須是 PDF,且不能超過 2MB。”

這時候你就不用搞“二選一”——

不是“要么用 accept”, 也不是“只用 JS 校驗(yàn)”。

最聰明的做法,是:兩者疊加使用。

先用 HTML 把格式錯得離譜的全部擋掉, 再用 JavaScript 做更細(xì)節(jié)的邏輯,比如文件大小。

舉個簡化版例子:

<input type="file" id="resumeFile" accept=".pdf" />
document.getElementById("resumeFile").addEventListener("change", (e) => {
  const file = e.target.files[0];

  if (file.size > 2 * 1024 * 1024) {
    alert("You can upload the file of maximum 2MB only.");
    e.target.value = ""; // 清空選擇
  }
});

這樣一來:

  • HTML 幫你擋掉 非 PDF 的所有文件

  • JS 再幫你篩掉 超過 2MB 的那部分

到了后端,你再進(jìn)行最終驗(yàn)證:

  • 再判斷 MIME

  • 再判斷大小

  • 再檢驗(yàn)文件內(nèi)容是否真的是你要的類型

這才是一個真正安全又順滑的上傳流程:

第一道關(guān):accept(友好 + 直觀)

第二道關(guān):前端 JS(體驗(yàn) + 提前反饋)

第三道關(guān):后端校驗(yàn)(絕對安全兜底)

多種文件類型的“精確過濾”,完全不需要第三方庫

很多時候,你上傳的不是“所有圖片”, 而是特定格式,比如只要 PNG 和 MP4。

以前很多人第一反應(yīng)是: “寫個復(fù)雜點(diǎn)的正則吧。”

但其實(shí),只要這樣寫就夠了:

<input type="file" accept="image/png, video/mp4" />

再比如,你的后臺只接受 CSV:

<input type="file" accept=".csv, text/csv" />

這背后復(fù)雜的 MIME 映射、兼容性細(xì)節(jié)、各種邊界情況, 瀏覽器已經(jīng)幫你扛了大半。

你只要靜靜地寫對 accept 里的字符串就行。

不用上第三方組件, 不用寫一堆莫名其妙的兼容代碼, HTML 本身就足夠強(qiáng)。

瀏覽器支持情況:能跑的地方,幾乎都能用

很多人聽到這里,第一個問題是:

“這么好用,會不會只在個別瀏覽器有效?”

簡單給你一句話版結(jié)論:

accept 屬性,在主流平臺上幾乎是全量支持

  • Chrome ?

  • Firefox ?

  • Safari ?

  • Edge ?

  • iOS Safari ?

  • Android Chrome ?

也就是說: 你可以非常安心地在正常項(xiàng)目里,上這個屬性。

再強(qiáng)調(diào)一次:不是說不要 JS,而是別讓 JS 做本不該它做的事

我并不是說:

“用 HTML 就夠了,JavaScript 都刪掉吧。”

JavaScript 在上傳邏輯里,依然非常重要:

  • 尺寸校驗(yàn)

  • 多文件規(guī)則

  • 上傳進(jìn)度條

  • 異步請求、重試機(jī)制

  • 各種復(fù)雜業(yè)務(wù)約束

這些都是 HTML 做不到的地方。

我想說的是:

有些事情,HTML 已經(jīng)幫你想好了, 你再用 JS 去重復(fù)造輪子, 不僅費(fèi)力,還容易寫出 bug。

有時候,一行寫錯的 JS, 能讓你整個上傳邏輯直接翻車; 而一個正確的 HTML 屬性, 則可以在問題發(fā)生之前,就悄悄幫你擋掉一半錯誤輸入。

常見文件類型對應(yīng)的MIME類型:

文件類型擴(kuò)展名MIME類型
JPEG圖像.jpg, .jpegimage/jpeg
PNG圖像.pngimage/png
GIF圖像.gifimage/gif
WebP圖像.webpimage/webp
SVG圖像.svgimage/svg+xml
PDF文檔.pdfapplication/pdf
Word文檔.docapplication/msword
Word文檔.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
Excel文件.xlsapplication/vnd.ms-excel
Excel文件.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
PPT文件.pptapplication/vnd.ms-powerpoint
PPT文件.pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentation
文本文件.txttext/plain
HTML文件.html, .htmtext/html
CSS文件.csstext/css
JavaScript.jsapplication/javascript
JSON文件.jsonapplication/json
XML文件.xmlapplication/xml
ZIP壓縮.zipapplication/zip
RAR壓縮.rarapplication/x-rar-compressed
7Z壓縮.7zapplication/x-7z-compressed
MP3音頻.mp3audio/mpeg
WAV音頻.wavaudio/wav
OGG音頻.oggaudio/ogg
MP4視頻.mp4video/mp4
AVI視頻.avivideo/x-msvideo
MOV視頻.movvideo/quicktime

最后的小結(jié):學(xué)會用好這一行,你會討厭你以前的寫法

如果你今天只能帶走一件事,那就是:

下次寫 <input type="file"> 的時候, 先想想:“我到底允許什么類型?”

然后,老老實(shí)實(shí)寫上 accept。

從此以后,你會發(fā)現(xiàn):

  • 用戶不再頻繁選錯文件

  • 你的錯誤彈窗少了一半

  • 你可以刪掉一堆啰嗦的前端類型校驗(yàn)

  • 上傳流程變得“自然順滑”,而不是“處處設(shè)陷阱”

HTML 沒有突然變聰明。 只是我們過去很多年, 把它當(dāng)成了“只能畫表單的塑料殼”, 忘了它其實(shí)有很多細(xì)膩的小能力,可以讓體驗(yàn)變得更優(yōu)雅。

寫得越久,我越服的一句話是:

代碼不一定要寫得花哨, 但一定要優(yōu)先把 已有的好工具,用明白。

accept 就是這樣的工具之一。

用過一次,你就再也不會回去寫那種: “上來不設(shè)限制、事后狂 alert 用戶”的上傳邏輯了。

accept 屬性是提高用戶體驗(yàn)的重要工具,但需要注意:

  • 不是安全措施:可以被繞過,必須進(jìn)行服務(wù)器驗(yàn)證

  • 提供良好UX:幫助用戶快速找到正確文件

  • 結(jié)合其他屬性:與 multiplecapture 等屬性配合使用

  • 現(xiàn)代瀏覽器支持:大部分瀏覽器都支持,但移動端行為可能不同

到此這篇關(guān)于input的accept屬性讓文件上傳安全高效的文章就介紹到這了,更多相關(guān)input文件上傳的accept屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決idea git切換多個分支后maven不生效的問題

    解決idea git切換多個分支后maven不生效的問題

    這篇文章主要介紹了解決idea git切換多個分支后maven不生效的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • VSCode中ESLint插件修復(fù)以及配置教程

    VSCode中ESLint插件修復(fù)以及配置教程

    最近為vsocde配置Eslint出現(xiàn)了許多問題,我解決問題之后,覺得還是把這些坑都寫清楚,方便學(xué)習(xí)前端的初學(xué)者,下面這篇文章主要給大家介紹了關(guān)于VSCode中ESLint插件修復(fù)以及配置教程的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Git多倉庫提交用戶信息動態(tài)設(shè)置實(shí)現(xiàn)方式

    Git多倉庫提交用戶信息動態(tài)設(shè)置實(shí)現(xiàn)方式

    本文介紹了在日常開發(fā)中,當(dāng)需要同時管理多個遠(yuǎn)程倉庫(如GitHub、Gitee、GitLab)并每個倉庫使用不同的郵箱和用戶名時,的操作步驟,通過修改.gitconfig配置文件,可以動態(tài)設(shè)置不同倉庫使用不同的用戶名和郵箱,從而避免頻繁切換郵箱的的繁瑣過程
    2026-04-04
  • git log根據(jù)特定條件查詢?nèi)罩静⒔y(tǒng)計(jì)修改的代碼行數(shù)

    git log根據(jù)特定條件查詢?nèi)罩静⒔y(tǒng)計(jì)修改的代碼行數(shù)

    這篇文章主要介紹了git log根據(jù)特定條件查詢?nèi)罩静⒔y(tǒng)計(jì)修改的代碼行數(shù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • json顯示日期帶T問題的解決方法

    json顯示日期帶T問題的解決方法

    使用json顯示日期時,細(xì)心的朋友會發(fā)現(xiàn)帶T字母,就是天數(shù)跟小時數(shù)之間出現(xiàn)了一個T,下面為大家介紹下具體的解決方法
    2013-10-10
  • Wireshark?TS系統(tǒng)吞吐慢問題解決方案

    Wireshark?TS系統(tǒng)吞吐慢問題解決方案

    這篇文章主要為大家介紹了Wireshark?TS系統(tǒng)吞吐慢問題解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 知識蒸餾聯(lián)邦學(xué)習(xí)的個性化技術(shù)綜述

    知識蒸餾聯(lián)邦學(xué)習(xí)的個性化技術(shù)綜述

    這篇文章主要為大家介紹了知識蒸餾聯(lián)邦學(xué)習(xí)的個性化技術(shù)綜述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Spark?GraphX?分布式圖處理框架圖算法詳解

    Spark?GraphX?分布式圖處理框架圖算法詳解

    這篇文章主要為大家介紹了Spark?GraphX?分布式圖處理框架圖算法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Git命令常用操作之代碼拉取和提交方式

    Git命令常用操作之代碼拉取和提交方式

    這篇文章主要介紹了Git命令常用操作之代碼拉取和提交方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • vscode?ssh遠(yuǎn)程連接服務(wù)器的思考淺析

    vscode?ssh遠(yuǎn)程連接服務(wù)器的思考淺析

    這篇文章主要為大家介紹了vscode?ssh遠(yuǎn)程連接服務(wù)器的思考淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評論

高台县| 洞头县| 宾川县| 厦门市| 东莞市| 长丰县| 沁源县| 永兴县| 洛川县| 富阳市| 无棣县| 高台县| 会泽县| 申扎县| 得荣县| 孟村| 仁化县| 同德县| 佛学| 佛教| 深水埗区| 乌拉特前旗| 邯郸市| 耿马| 建平县| 建瓯市| 北票市| 益阳市| 晴隆县| 樟树市| 湖南省| 宝山区| 民丰县| 莎车县| 井陉县| 洪雅县| 富阳市| 井冈山市| 临西县| 德化县| 拜泉县|