天天看點

【技術幹貨】前端工程師看過來!一種Ajax縮放圖檔上傳的辦法 !

【技術幹貨】前端工程師看過來!一種Ajax縮放圖檔上傳的辦法 !

本文作者:上海駐雲開發實施工程師 方舟

以下正文

<b>

</b>

最近做的應用裡面有上傳圖檔的功能,由于圖檔直接丢進阿裡雲oss,是以不想通過伺服器端程式來寫縮放功能,查了一下找到一篇文章,點我 ,這篇總體步驟來說是ok的,但是裡面有好多坑。本來準備把上傳的獨立一篇寫出來的,後來發現太短,加到後面吧。ps:想直接看完整可以用版代碼的請直接拖到最下。

首先建立img并畫到canvas上這一步,他的代碼連起來是這樣的:

【技術幹貨】前端工程師看過來!一種Ajax縮放圖檔上傳的辦法 !

但是這樣寫canvas裡面什麼都不會出現,我昨天跟這段代碼戰鬥了小半天,才發現他應該改成:

【技術幹貨】前端工程師看過來!一種Ajax縮放圖檔上傳的辦法 !

這是因為javascript是異步調用的,正序執行的時候img還沒畫出來,ctx.drawimage已經調用了,導緻什麼效果都有。

上面那段代碼的最後一句也是個坑,在chrome,safari下都報錯,其實應該寫成:

【技術幹貨】前端工程師看過來!一種Ajax縮放圖檔上傳的辦法 !

然後要将canvas轉換成檔案來上傳,這篇寫了這兩個方法:

【技術幹貨】前端工程師看過來!一種Ajax縮放圖檔上傳的辦法 !

然而實際上mozgetasfile隻有firefox支援,是以為了相容chrome跟safari我去查了一下dataurl怎麼用。這個原文就找不到了,也被坑了一次,搜尋到的前幾條好多blobbuilder的,這玩意不知道什麼時候就deprecated了,最新版的chrome跟safari都沒這類,最終找到了一個arraybuffer直接轉換blob的代碼:

【技術幹貨】前端工程師看過來!一種Ajax縮放圖檔上傳的辦法 !

這段代碼在chrome裡面用的毫無問題,但是safari生成的blob隻有十幾位元組,這明顯不科學。mdn blob 上查到可以直接把arraybuffer傳到blob構造函數裡面,于是就變成了

【技術幹貨】前端工程師看過來!一種Ajax縮放圖檔上傳的辦法 !

現在圓滿了,就剩一個小問題,chrome下會提示把arraybuffer傳入blob構造函數的行為deprecated了。

接下來就是檔案上傳了,用到了jquery。

【技術幹貨】前端工程師看過來!一種Ajax縮放圖檔上傳的辦法 !

這個沒啥坑,有個小問題,按之前的辦法生成的blob拿過來上傳的時候在firefox裡面無法顯示progress,應該是firefox隻有上傳檔案才有prgress事件。

以下是完整可用代碼:

【技術幹貨】前端工程師看過來!一種Ajax縮放圖檔上傳的辦法 !

<b>好啦 ~ ~ ~ 本文到這裡也就結束啦 ~ 如果還希望了解更多相關知識的話,就趕緊訂閱我們吧~每天新鮮幹貨送上呦 ~</b>

繼續閱讀