<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          老弟做了個(gè)網(wǎng)盤,炸了!

          共 2183字,需瀏覽 5分鐘

           ·

          2021-08-11 15:06

          趣講文件上傳功能的巧妙設(shè)計(jì)

          大家好,我是魚皮。

          不知道大家有沒有想過制作一款自己的網(wǎng)盤呢?這不,我學(xué)編程的老弟小阿巴做了一個(gè),非常激動(dòng)地找我來體驗(yàn)。

          打開網(wǎng)盤,界面仿的還不錯(cuò),我簡單試了下文件的上傳和下載,沒有什么問題。

          阿巴網(wǎng)盤

          正當(dāng)小阿巴洋洋得意時(shí),我試著上傳一個(gè) 1 GB 大小的文件。結(jié)果文件上傳到 99% 時(shí),網(wǎng)絡(luò)一抖,文件上傳失敗,竟然還要從 0 開始重新上傳?!

          小阿巴無奈地?fù)蠐项^:網(wǎng)絡(luò)不好,怪我咯?

          我直接一巴掌甩過去,要知道,制作網(wǎng)盤可不是一件容易的事!

          先從最基礎(chǔ)的功能來說,要實(shí)現(xiàn)文件的上傳、存儲(chǔ)、下載、文件和目錄管理。如果要真正上線、開放給其他人使用,還要考慮到權(quán)限管理、接口訪問、CDN 加速,無論哪點(diǎn)自己來做都是很麻煩的。

          所以除了學(xué)習(xí)之外,如果想要搭建自己的私人網(wǎng)盤,建議直接選擇一些開源的,比如主流的 Seafile、Nextcloud、Cloudreve、OwnCloud 都可以。

          當(dāng)然,公用網(wǎng)盤最要命的還是帶寬、存儲(chǔ)等資源的費(fèi)用,所以為了節(jié)約成本、支持更多用戶訪問,很多網(wǎng)盤都采取了限速、限制容量策略。

          小阿巴:做了網(wǎng)盤這么麻煩啊,我放棄我放棄。。。

          我笑到:雖然想做好網(wǎng)盤很難,但我們可以一步步來,學(xué)習(xí)每個(gè)功能中的優(yōu)秀設(shè)計(jì),相信最后也能做出一款不錯(cuò)的網(wǎng)盤。今天就先從 文件上傳 講起吧,解決下剛剛上傳失敗必須從 0 重新上傳的問題等。

          文件上傳設(shè)計(jì)

          文件上傳顧名思義就是把文件從本地電腦發(fā)送到存儲(chǔ)文件的遠(yuǎn)程服務(wù)器上,小文件的上傳倒沒有什么好說的,主要考慮的是大文件上傳怎么 更快、更穩(wěn)定、更靈活、更快響應(yīng) 等等,以提高用戶的體驗(yàn)。

          這里分享幾個(gè)經(jīng)典的大文件上傳設(shè)計(jì),包括文件分塊、并發(fā)上傳、斷點(diǎn)續(xù)傳、秒傳、異步上傳。

          文件分塊

          既然小文件的處理相對(duì)容易,那不妨在發(fā)送前,把大文件分割為多個(gè)連續(xù)的小文件,一塊一塊地發(fā)送。

          文件分塊

          此外,需要在發(fā)送每一個(gè)文件塊時(shí),額外傳輸一些信息,比如當(dāng)前塊數(shù)、文件總塊數(shù)、文件大小、所屬原文件標(biāo)識(shí)(MD5)等:

          這樣,服務(wù)器就能一塊一塊地接收,把這些文件塊保存到臨時(shí)目錄中。當(dāng)接收到最后一塊時(shí),把之前的所有文件塊再拼接到一起,就能組成完成的原文件啦。

          并發(fā)上傳

          將大文件分塊后,就可以通過多線程并發(fā)上傳,同時(shí)傳輸多個(gè)塊:

          串行上傳和并發(fā)上傳

          要根據(jù)網(wǎng)絡(luò)情況決定是否并發(fā)上傳、同時(shí)并發(fā)上傳多少個(gè)塊,不是并發(fā)數(shù)越多越好。網(wǎng)絡(luò)好的話,并發(fā)數(shù)量調(diào)大一些,能夠大大提高文件整體上傳效率;相反,盲目調(diào)整并發(fā)數(shù),上傳可能會(huì)更慢。

          斷點(diǎn)續(xù)傳

          對(duì)于大文件來說,上傳中斷后如果要從 0 開始重傳,就太讓人崩潰了!

          推薦使用斷點(diǎn)續(xù)傳技術(shù),原理很簡單,在文件分塊的基礎(chǔ)上,服務(wù)器記錄一下原文件對(duì)應(yīng)的上傳進(jìn)度,每接收到一個(gè)塊,就更新一下進(jìn)度。這樣,即使網(wǎng)絡(luò)故障導(dǎo)致上傳失敗,也能從上傳進(jìn)度中知道哪些文件塊已上傳、接下來需要從哪一塊重新開始了,而不用從第 1 塊開始重新傳輸。

          斷點(diǎn)續(xù)傳

          該原理同樣適用于文件下載。

          斷點(diǎn)續(xù)傳有很多種實(shí)現(xiàn)方式,自主實(shí)現(xiàn)、HTTP 協(xié)議 1.1 等,感興趣的同學(xué)可以了解下。

          秒傳

          不知道大家有沒有發(fā)現(xiàn),有時(shí),我們上傳一個(gè)幾 GB 的超大文件竟然可以在 1 秒內(nèi)完成!

          這是咋實(shí)現(xiàn)的呢?真相只有一個(gè),該文件肯定之前已經(jīng)被上傳過了!

          這就是經(jīng)典的秒傳技術(shù)。

          上傳文件前,先在客戶端(比如瀏覽器)根據(jù)文件內(nèi)容計(jì)算出文件的 MD5 值,相同內(nèi)容的文件 MD5 值必然相同。然后在服務(wù)器已上傳文件數(shù)據(jù)庫中查找該 MD5 對(duì)應(yīng)的文件是否已存在。如果不存在,上傳文件并在上傳成功后將該文件信息插入數(shù)據(jù)庫,過程如下:

          文件秒傳 - 文件不存在

          若文件已存在,直接新建一個(gè)對(duì)該文件的引用就行了,不必重復(fù)上傳,過程如下:

          文件秒傳 - 文件已存在

          不過要注意,不同內(nèi)容文件的 MD5 值也可能會(huì)相同(碰撞),導(dǎo)致用戶下載到不是自己上傳的文件,所以檢驗(yàn)重復(fù)時(shí),還可以補(bǔ)充一些校驗(yàn),比如針對(duì)文件前幾位再生成一個(gè) MD5、用其他 Hash 算法再生成一個(gè)校驗(yàn)值等。

          異步上傳

          除了同步上傳外,當(dāng)我們要上傳的文件不在本地而是已經(jīng)存在對(duì)應(yīng) url 時(shí),也可以采用 全異步上傳 的方式,將文件上傳變成一個(gè) 任務(wù)

          用戶輸入要上傳的文件 url,點(diǎn)擊上傳后,不需要一直在文件上傳頁面等著,而是只需要告訴后臺(tái) “我要執(zhí)行文件上傳”,并向后臺(tái)新建一個(gè)文件上傳任務(wù),就可以快速響應(yīng)用戶了,比如 “文件上傳中,請(qǐng)留意通知”。等后臺(tái)取出并真正完成文件上傳的任務(wù)后,給用戶發(fā)送通知就可以了。

          整體步驟如下:

          異步上傳



          最后,如果只是需要在開發(fā)中用到文件上傳,大可不必自己實(shí)現(xiàn)上述功能,用個(gè)現(xiàn)成的對(duì)象存儲(chǔ)服務(wù)就好了。比如七牛云,分塊上傳什么的都給我們做好了,也可以參考七牛云 SDK 文檔(https://github.com/qiniu)來了解它們的實(shí)現(xiàn)方式。

          以上就是本期分享,我是魚皮,點(diǎn)贊 + 在看 還是要求一下的,祝大家都能心想事成、發(fā)大財(cái)、行大運(yùn)。

          往期推薦

          聊聊我在騰訊和字節(jié)工作感受

          送老弟去大廠面試,全中!

          網(wǎng)站搜索大優(yōu)化!

          遠(yuǎn)程開發(fā),確實(shí)爽!

          5 分鐘!我上線了新網(wǎng)站!

          瀏覽 57
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  俺去俺来也在线www色官网 | 一级黄色视频片 | 欧美偷拍精品 | 激情综合一色播 | 使劲操蜜桃av |