如何使用 Ajax 實現上傳圖片時預覽及上傳進度效果

来源:https://www.cnblogs.com/lifeisliving/archive/2022/05/20/16292488.html
-Advertisement-
Play Games

一、引言 繼上次實現文件上傳功能後,產品經理又提出了新的需求:上傳圖片預覽及進度條效果。本次就來搞定這個功能,這次開發基於上次的隨筆,需要的小伙伴們自取 -- 如何使用Ajax實現簡單的文件上傳。 二、瞭解原理 要想實現文件預覽效果,這裡使用的是 FileReader 對象。使用它的 readAsD ...


一、引言

  繼上次實現文件上傳功能後,產品經理又提出了新的需求:上傳圖片預覽及進度條效果。本次就來搞定這個功能,這次開發基於上次的隨筆,需要的小伙伴們自取 -- 如何使用Ajax實現簡單的文件上傳

二、瞭解原理

  要想實現文件預覽效果,這裡使用的是 FileReader 對象。使用它的 readAsDataURL 方法將圖片內容轉化為URL格式的Base64字元串,然後就可以在其onload事件中用src屬性將圖片渲染到頁面進行預覽了。

  要想實現文件上傳進度效果,這裡使用的是xhr(XMLHttpRequest)的 progress 事件。在此方法中我們可以獲取到文件的總大小以及已經發送的大小,進而計算得到上傳的百分比。

  理論存在,開始實踐!

三、編碼測試

  在上次的Demo基礎上對頁面進行了一些調整,代碼如下:

<div>
    <input id="upload" type="file" multiple style="display: none;" />
    <input id="bt1" type="button" value="點擊選擇" />
    <input id="bt2" type="button" value="列印對象" />
    <input id="bt3" type="button" value="載入預覽" />
    <input id="bt4" type="button" value="開始上傳" />
    <span>上傳進度:</span><span id="prog">0%</span>
    <br />
    <div id="div1" style="height: 200px;"></div>
</div>

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

        var upload = $("#upload");

        $("#bt1").on('click', function () {
            upload.click();
        });

        $("#bt2").on('click', function () {
            console.log(upload[0].files);
        });

        $("#bt3").on('click', function () {
            var div = $("#div1");
            for (var i = 0; i < upload[0].files.length; i++) {
                var reader = new FileReader();
                reader.readAsDataURL(upload[0].files[i]); //依次讀取圖片
                reader.onload = function (e) { //讀取完畢回調
                    var img = $("<img width='200' height='200' >").attr('src', e.target.result);
                    div.append(img); //將其追加到頁面上
                }
            }
        });

        $("#bt4").on('click', function () {
            var formdata = new FormData();
            for (var i = 0; i < upload[0].files.length; i++) {
                formdata.append('pic', upload[0].files[i]);
            }
            $.ajax({
                type: "post",
                url: "Default/Upload",
                data: formdata,
                contentType: false,
                processData: false,
                success: function (data) {
                    console.log("success!");
                },
                error: function () {
                    console.error("error!");
                },
                xhr: function () {
                    var myXhr = $.ajaxSettings.xhr();
                    if (myXhr.upload) { //檢查upload屬性是否存在
                        myXhr.upload.addEventListener('progress', progressHandlingFunction, false); //綁定progress事件的回調函數
                    }
                    return myXhr; //xhr對象返回給jQuery使用
                }
            });

            function progressHandlingFunction(event) {
                var loaded = Math.floor(100 * (event.loaded / event.total)); //計算已經上傳的百分比
                $("#prog").html(loaded + "%"); //應用到顯示UI,可根據自己需要修改
            }
        });
    })
</script>

  文件對象信息列印如下:

  圖片預覽效果圖:

  由於本地上傳比較快,圖片太小了看不出效果,我特意選了張50M的圖片,或者大家使用Chrome的網路工具將網速調慢進行測試:

 

四、總結

  基本功能算是實現了,UI還可以優化一下,大家也可以自己花點功夫將圖片上傳功能完善,添加大圖預覽等功能,然後封裝成一個控制項供以後使用。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、安裝mysql8.0 ##下載mysql安裝包 http://mirrors.sohu.com/mysql/MySQL-8.0/ wget http://mirrors.sohu.com/mysql/MySQL-8.0/mysql-community-client-8.0.18-1.el7.x8 ...
  • 分享嘉賓:王懷遠 阿裡雲 表格存儲架構師 編輯整理:李瑤 DataFun 出品平臺:DataFunTalk 導讀: 大家好,我是王懷遠,我2015年加入阿裡雲,一直從事表格存儲的研發和架構相關工作,目前擔任表格存儲的架構師。我在存儲和資料庫領域有一些研發和架構方面的經驗。 本次分享的主題是一站式物聯 ...
  • 一、概述 Impala 直接針對存儲在 HDFS、HBase或 Amazon Simple Storage Service (S3)中的 Apache Hadoop 數據提供快速的互動式 SQL 查詢。Impala是一個基於Hive、分散式、大規模並行處理(MPP:Massively Paralle ...
  • 今天我們來認識一位接觸 OpenHarmony 不到一年,便帶領團隊成功開發出一款“啟航 KP“智能開發套件的開發者——軟通動力資深項目經理許北林。 ...
  • 這次更新的設計規範不僅新增了更多應用場景案例,幫助大家高效設計不同類型的業務應用,還通過清晰直觀的案例對比圖,幫助大家有效避坑。 ...
  • 在音視頻應用中我們經常涉及到耳機麥克風和設備麥克風的切換。不同聲道的配置。在遇到這種情況的時候,我們如何配置呢? 耳返即耳機採集監聽,在設備上插入耳機(普通耳機或藍牙耳機)後,能從本機耳機側聽到本設備麥克風采集的聲音。 雙聲道即兩個聲音通道,聽到聲音時可以根據左耳和右耳對聲音相位差來判斷聲源的具體... ...
  • 對於運營者來說,消息推送一直是提升用戶活躍與轉化的重要工具,如何在提升轉化的情況下,同時不降低用戶的接受程度,這一直是運營不斷追求的目標。 好的推送不只在於優質的推送內容,還需要把握合適的時機。在合適時機把用戶喜歡的內容推送給他們,才能有效促進推送轉化。作為一名用戶,大家每天都會在各個時間點收到不同 ...
  • 堆積了兩天一起發的,先祝大家節日快樂 後面任務很繁重,還有登錄註冊組件還有後臺管理頁面,真的繁重,我現在感覺每天全天時間都在學都不一定學得完,主要想在六月一號之前把整個項目過一遍。看看能不能創造奇跡 一.防抖和節流 拋出一個問題,就是我們的三級聯動,正常情況你慢慢的去滑動是沒有bug的,但是當你快速 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文將以 C# 語言來實現一個簡單的布隆過濾器,為簡化說明,設計得很簡單,僅供學習使用。 感謝@時總百忙之中的指導。 布隆過濾器簡介 布隆過濾器(Bloom filter)是一種特殊的 Hash Table,能夠以較小的存儲空間較快地判斷出數據是否存在。常用於允許一定誤判率的數據過濾及防止緩存 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 「簡單有價值的事情長期堅持做」 這是成功最簡單,但也最難學的秘訣。不經過訓練,人很難意識到時間複利的威力。 仙劍奇俠傳的「十里坡劍神」和金庸群俠傳的「十級野球拳」,就是簡單的事情持之以恆反覆做,最後就有巨大的威力 唐家三少成為網文收入第一,最重要的一步是十四年從未斷日更 這樣的案例很多,一開始可能成 ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“我愛加班”。 面試開始,直入正題。 面試官: 看你簡歷上面寫著精通MySQL,我先問你事務的特性是什麼? 老生常談,這個還有誰不會背的嗎? 我: ...
  • 基礎知識 python是一門腳本語言,它是解釋執行的。 python使用縮進做為語法,而且python2環境下同一個py文件中不能同時存在tab和空格縮進,否則會出錯,建議在IDE中顯示縮進符。 python在聲明變數時不寫數據類型,可以type(xx)來獲取欄位的類型,然後可以int(),list ...
  • 為什麼要多線程下載 俗話說要以終為始,那麼我們首先要明確多線程下載的目標是什麼,不外乎是為了更快的下載文件。那麼問題來了,多線程下載文件相比於單線程是不是更快? 對於這個問題可以看下圖。 橫坐標是線程數,縱坐標是使用對應線程數下載對應文件時花費的時間,藍橙綠代表下載文件的大小,每個線程下載對應文件2 ...
  • 詳細講解python爬蟲代碼,爬微博搜索結果的博文數據。 爬取欄位: 頁碼、微博id、微博bid、微博作者、發佈時間、微博內容、轉發數、評論數、點贊數。 爬蟲技術: 1、requests 發送請求 2、datetime 時間格式轉換 3、jsonpath 快速解析json數據 4、re 正則表達式提... ...
  • 背景: 一般我們可以用HashMap做本地緩存,但是HashMap功能比較弱,不支持Key過期,不支持數據範圍查找等。故在此實現了一個簡易的本地緩存,取名叫fastmap。 功能: 1.支持數據過期 2.支持等值查找 3.支持範圍查找 4.支持key排序 實現思路: 1.等值查找採用HashMap2 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 本章是系列文章的第八章,用著色演算法進行寄存器的分配過程。 本文中的所有內容來自學習DCC888的學習筆記或者自己理解的整理,如需轉載請註明出處。周榮華@燧原科技 寄存器分配 寄存器分配是為程式處理的值找到存儲位置的問題 這些值可以存放到寄存器,也可以存放在記憶體中 寄存器更快,但數量有限 記憶體很多,但 ...