1. 程式人生 > >H5標籤input標籤上傳檔案(一)

H5標籤input標籤上傳檔案(一)

之前專案做檔案上傳(本篇著重講純圖片上傳)的時候,一般都是用的flash外掛。
H5的input標籤提供了type=file的檔案上傳功能,那麼如何用這個標籤實現前後端之間的檔案上傳呢。
百度了一下,一個能用的都沒有,都有BUG,講的也很複雜,好氣喔,自己寫吧!

先看部分程式碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>H5input標籤上傳檔案</title>
        <script
type="text/javascript" src="jquery.min.js">
</script> </head> <body> <input type="file" name="image" accept="image/*" onchange="uploadImg()"> <script type="text/javascript"> function uploadImg(event) { var e=window.event||event; // 獲取當前選中的檔案
var oFile = e.target.files[0]; console.log(oFile);//列印值看下面圖片,簡單點的話我們直接把這個資料給後臺處理就可以了 //接下來按照跟後臺約定好的進行資料互動就可以-不使用jq的話這裡有一些細節,稍後解釋 $.post("約定好的url地址",oFile,function(result){ console.log(result); }) }
</script> </body> </html>

上面console.log(oFile);這一行程式碼列印的結果如下:
這裡寫圖片描述
簡單點,寫部落格的方式簡單點,不要為了顯擺自己的技術寫一堆API文件都可以查到的東西。
這裡給想深入瞭解的H5上傳的同學三個相關的知識連結(沒錯,MDN上的API描述):
FormData
FileReader()
Blob()

上面只是一個簡陋的方案(但完全可用),接下來讓我們完善一下!

既然做的是單張圖片上傳功能,這裡我在input標籤上加了一個accept="image/*" 做了一個基本的型別限制,這樣你在選擇檔案的時候你會發現你能選擇檔案型別是圖片檔案。
這裡寫圖片描述

我們可以自定義可上傳的檔案型別,用如下方式指定多種型別:
<input type="file" accept=".doc,.docx,.pdf,.txt,.htm,.html" />

但是這並不能防止使用者的惡意操作(主要是堵住測試和後臺的嘴,☺),另外就算是選擇型別是圖片的話,其實還是可以選擇少部分其它格式例如.zip。
利用之前給展示過的oFile列印結果中的type欄位

// 檢查上傳檔案型別--新增到傳送資料之前
if(['jpeg', 'png', 'gif', 'jpg'].indexOf(oFile.type.split("/")[1]) < 0) {
    // alert太ugly了,用你們系統的報錯彈窗就行(如果有)
    alert("上傳的檔案必須是圖片格式");
    return;
}

好,圖片的格式算是限制了,數組裡面沒涉及到的格式你自己往裡面加。

額外補充一點,你會發現當我要做上傳所有型別的檔案時,通過oFile.type去判斷檔案型別好像有點問題,那麼這裡我提供一個穩妥的辦法,我們通過oFile.name去判斷,程式碼如下:

// 限制檔案型別
var fileType = oFile.name.substr(oFile.name.lastIndexOf(".")+1);
if (['doc', 'docx', 'pdf', 'txt', 'htm', 'html'].indexOf(fileType) < 0) {
    alert("只支援.doc .docx  .pdf  .txt  .htm .html格式檔案");
    return;
 }

上傳檔案的大小也限制一下,前端做限制很簡單,利用之前oFile列印結果中的size欄位,這裡API給我們返回的是所選檔案的位元組數,1KB=1024位元組,1MB=1024KB。利用以上,我們加個判斷:

var imgMaxSize = 1024 * 1024 * 4; // 4MB圖片的位元組數
if(oFile.size>imgMaxSize){
    alert("您可上傳檔案的最大限制為4MB");
    return;
}

如果你用的是jquery.ajax,並且你上傳的是文件檔案,可能ajax會對你的檔案進行預處理,然後你就可能遇到如下錯誤:
Illegal invocation這時候我們在ajax裡面配置一下選項processData:false, 關掉jquery的預處理就行了,一般這種問題多發生在文件檔案上。

$.ajax({
    type:'POST',
    url:url,
    data:formData,
    contentType:undefined,
    processData:false,            
    success:function(data){}
 });

還有一些東西,例如圖片上傳前壓縮啊什麼的,不想寫長篇,這裡先不講了,在這裡放一個簡單完整版的程式碼,方便我自己以後copy,你們要用自己拿,別客氣!

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8" />
        <title>H5-input標籤上傳檔案</title>
        <script type="text/javascript" src="jquery.min.js"></script>
    </head>

    <body>
        <input type="file" accept="image/*" onchange="uploadImg()">

        <script type="text/javascript">
            function uploadImg(event) {

                var e = window.event || event;
                var oFile = e.target.files[0];
                //console.log(oFile);

                var imgMaxSize = 1024 * 1024 * 4; //4MB

                // 限制檔案型別
                if(['jpeg', 'png', 'gif', 'jpg'].indexOf(oFile.type.split("/")[1]) < 0) {
                    alert("僅可以上傳圖片格式檔案");
                    return;
                }

                //限制大小
                if(oFile.size > imgMaxSize) {
                    alert("檔案最大為4MB");
                    return;
                }

                var data=new FormData();
                data.append("filesData",file);//這裡不管怎樣,我決定還是用formdata的方式上傳。

                $.post("約定地址",data,function(result){
                    console.log(result);
                })

            }
        </script>
    </body>

</html>

相關推薦

H5標籤input標籤檔案

之前專案做檔案上傳(本篇著重講純圖片上傳)的時候,一般都是用的flash外掛。 H5的input標籤提供了type=file的檔案上傳功能,那麼如何用這個標籤實現前後端之間的檔案上傳呢。 百度了一下,一個能用的都沒有,都有BUG,講的也很複雜,好氣喔,自己寫

使用form表單檔案

今天在專案中要寫一個上傳檔案的功能,使用jsp中的form表單的形式完成。 首先新建一個jsp,使用最原始的form表單來完成。 jsp中的程式碼如下,很簡單: <form method="post" action="<%=ermDomainUrl %>

springboot/springmvc檔案CommonsMultipartResolver

上一篇博文講到了(Servlet3.0支援)的檔案上傳:https://blog.csdn.net/frozenpower/article/details/81141297 這篇我們來看可配置的檔案上傳解析器CommonsMultipartResolver CommonsMultipartR

angularjs手機webapp 利用input拍照,相簿選擇、縮圖顯示 圖片

執行後的截圖: html程式碼 <ul class="list_img"> <li ng-repeat="imageSrc in imgshows track by $index"> <img n

SpringMVC檔案圖片並儲存到本地

SpringMVC上傳檔案(圖片)並儲存到本地 小記一波~ 基本的MVC配置就不展示了,這裡給出核心程式碼 在spring-mvc的配置檔案中寫入如下配置 <bean id="multipartResolver" class="org.springframewor

國慶七篇-----struts2的檔案下載

       struts2提供了檔案的上傳下載功能,不過需要我們對其提供相關的檔案引數。 比如檔案上傳,必須提供三種屬性,並對其提供setter和getter方法,而且必須按照以下規範命名: private File XXX; private String XXXFi

使用表單檔案

先寫一個簡單的表單,根據上一篇文章說的步驟進行 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCT

commons-fileupload檔案圖片時路徑寫入資料庫時斜槓的問題

前端:常規的二進位制form表單,這裡不贅述了。 後端:常規的Java servlet處理資料。其關鍵的程式碼如下: String _today = new SimpleDateFormat("yyyyMMdd") .format(new java.util.Date

鍵jquery非同步檔案圖片的實現檔案進度讀取未做

本文采用boostrap、、jquery、jade(html的一種模板)、nodejs實現 最終實現的效果:一個按鈕在選擇完檔案後,自動上傳到後臺; -改變input樣式 在form表單中,用<a>包裹<input type="file">,讓i

springmvc檔案圖片

環境:springmvc+spring+mybatis 前提環境,需要把ssm框架搭建好,如果沒有搭建的話可以先搭建這個框架 然後需要新增jar包 pom裡面新增 <!-- 上傳元件 --> <!-- https://mvnre

js檔案圖片限制格式及大小為3M · 觀止

如果你想快速解決這個問題,看本文就夠了。查了好多資料,終於解決了,太耗時間了,本文留給給後來者,希望你們工作的更輕鬆 本文儲存為.html檔案用瀏覽器開啟即可測試功能 <form id="fo

js檔案圖片限制格式及大小

如果你想快速解決這個問題,看本文就夠了。查了好多資料,終於解決了,太耗時間了,本文留給給後來者,希望你們工作的更輕鬆 本文儲存為.html檔案用瀏覽器開啟即可測試功能 <form id="form1" name="form1" method="post" actio

Cisco 路由器IOS

log 技術分享 fff 分享 進行 剩余空間 ftp服務 delete cisco 路由器 (1)路由器上查看IOS。 通過dir flash: 命令查看IOS版本,flash的空間大小及剩余量。如果剩余空間不夠上傳新的IOS時候,上傳的時候會報錯。此時需刪掉原來的IOS

漏洞

漏洞 內容 如果 訪問 nbsp 文件中 一個 6.0 我們 解析漏洞 (1)IIS解析漏洞 ①當建立一個*.asa、*.asp格式的文件夾時,這個文件夾裏的任意文件都會被當做asp文件來執行。 如果我們上傳一個txt文件,文件內容是asp一句話木馬,一句話木馬將會被解析,

wangEditor的使用及圖片

      由於業務需要,最近新入手了一款富文字編輯器wangEditor,這是一款輕量級的富文字編輯器,比起百度的ueditor,這款編輯器的介面更加簡單,文件也很詳細。對於需求不是很高的功能來說,這款編輯器實在是不二之選。 一、wangEditor的基

Vue + Canvas 實現頭像截圖功能

        此文共分為兩篇,上篇主要是展示最終的效果,下篇為程式碼實現部分。         首先,上圖看最終的製作效果。         這是選擇圖片前:         這是選擇圖片後:         主要需求有這幾點:       

Ajax 檔案input file FormData

FormData物件用以將資料編譯成鍵值對,以便用XMLHttpRequest來發送資料。其主要用於傳送表單資料,但亦可用於傳送帶鍵資料(keyed data),而獨立於表單使用。 jQuery Ajax 上傳檔案 通過 Ajax 向後臺傳送檔案(包括圖片)時,其引數型別屬於物件。可以建立一個 FormD

用form表單input type="file"檔案提交前判斷

1、用/jquery.form.js上傳檔案,提交前判斷是否選擇了檔案(之前很糾結判斷問題,寫在beforeSend裡面不管什麼情況都會提交) 2、用ajax接收資訊 3、優化提交按鈕樣式 HTML頁面程式碼: <script src="/JS/jquery.fo

ASP 使用 jQuery Ajax File Uploader外掛檔案適用於支援H5的瀏覽器

  開篇先吐個槽:自從公司策略調整以後,幾乎沒有什麼3D、AR、VR的專案讓我來做了~於是···為了避免被認為無所事事, 只好硬著頭皮開始做ASP的專案了~~好在大家用的都是C# ┐(´∀`)┌ 迴歸正題,當前接手的ASP專案是執行在微信平臺的一個上傳視訊投票的小專案,裡面

input file實現多次檔案不會覆蓋上次檔案

html原生的file多選控制元件:<input class="className" type="file" name="name" accept="image/*" multiple /> 存在問題:第一次選擇了n個檔案,第二次選中m個檔案,第二次選擇結束