国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

大文件分片上傳的實現(xiàn)【前后臺完整版】

這篇具有很好參考價值的文章主要介紹了大文件分片上傳的實現(xiàn)【前后臺完整版】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在一般的產(chǎn)品開發(fā)過程中,大家多少會遇到上傳視頻功能的需求,往往我們采用的都是對視頻大小進(jìn)行限制等方法,來防止上傳請求超時,導(dǎo)致上傳失敗。這時候可能將視頻分片上傳可以對你的項目有一個小小的體驗優(yōu)化。

本片文章前端是vue,后臺基于PHP進(jìn)行的分片上傳,需要的小伙伴可以借鑒。

分片上傳

1、什么是分片上傳

分片上傳,就是將所要上傳的文件,按照一定的大小,將整個文件分隔成多個數(shù)據(jù)塊(我們稱之為Part)來進(jìn)行分別上傳,上傳完之后再由服務(wù)端對所有上傳的文件進(jìn)行匯總整合成原始的文件。

2、分片上傳的場景

(1)大文件上傳

(2)網(wǎng)絡(luò)環(huán)境環(huán)境不好,存在需要重傳風(fēng)險的場景

3、實現(xiàn)流程步驟

a、方案一,常規(guī)步驟、本文實現(xiàn)的步驟

將需要上傳的文件按照一定的分割規(guī)則,分割成相同大小的數(shù)據(jù)塊;

初始化一個分片上傳任務(wù),返回本次分片上傳唯一標(biāo)識;

按照一定的策略(串行或并行)發(fā)送各個分片數(shù)據(jù)塊;

發(fā)送完成后,服務(wù)端根據(jù)判斷數(shù)據(jù)上傳是否完整,如果完整,則進(jìn)行數(shù)據(jù)塊合成得到原始文件。

b、方案二

前端(客戶端)需要根據(jù)固定大小對文件進(jìn)行分片,請求后端(服務(wù)端)時要帶上分片序號和大小

服務(wù)端創(chuàng)建conf文件用來記錄分塊位置,conf文件長度為總分片數(shù),每上傳一個分塊即向conf文件中寫入一個127,那么沒上傳的位置就是默認(rèn)的0,已上傳的就是Byte.MAX_VALUE 127(這步是實現(xiàn)斷點續(xù)傳和秒傳的核心步驟)

服務(wù)器按照請求數(shù)據(jù)中給的分片序號和每片分塊大小(分片大小是固定且一樣的)算出開始位置,與讀取到的文件片段數(shù)據(jù),寫入文件。

前端代碼

template


// 上傳按鈕樣式

移入方法

import { uploadByPieces } from "@/utils/upload"; //引入uploadByPieces方法
methods
// 分片上傳
videoSaveToUrl(file) {
  uploadByPieces({
    file: file, // 獲取到的視頻文件
    pieceSize: 3, // 分片大小  這里是3M一片
    success: (data) => {
      this.formValidate.video_link = data.file_path;
      this.progress = 100;    // 上傳成功 進(jìn)度條為100%
    },
    error: (e) => {
      this.$Message.error(e.msg);  //報錯信息
    },
    uploading: (chunk, allChunk) => {
      this.videoIng = true;   // 上傳時進(jìn)度條展示 根據(jù)需要添加
      let st = Math.floor((chunk / allChunk) * 100);  這里是用上傳的第幾片除以總片數(shù)進(jìn)行百分比計算
      this.progress = st;
    },
  });
  return false;
},
utils/upload

utils/upload

import md5 from 'js-md5' //引入MD5加密
import { upload } from '@/api/upload.js'  // 這里指前端調(diào)用接口的api方法
export const uploadByPieces = ({ file, pieceSize = 2, success, error, uploading }) => {
    // 如果文件傳入為空直接 return 返回
    if (!file) return
    let fileMD5 = ''// 總文件列表
    const chunkSize = pieceSize * 1024 * 1024 // 5MB一片
    const chunkCount = Math.ceil(file.size / chunkSize) // 總片數(shù)
    console.log(chunkSize, chunkCount)
    // 獲取md5
    const readFileMD5 = () => {
        // 讀取視頻文件的md5
        console.log("獲取文件的MD5值")
        let fileRederInstance = new FileReader()
        console.log('file', file)
        fileRederInstance.readAsBinaryString(file)
        fileRederInstance.addEventListener('load', e => {
            let fileBolb = e.target.result
            fileMD5 = md5(fileBolb)
            console.log('fileMD5', fileMD5)
            console.log("文件未被上傳,將分片上傳")
            readChunkMD5()
        })
    }
    const getChunkInfo = (file, currentChunk, chunkSize) => {
        let start = currentChunk * chunkSize
        let end = Math.min(file.size, start + chunkSize)
        let chunk = file.slice(start, end)
        return { start, end, chunk }
    }
    // 針對每個文件進(jìn)行chunk處理
    const readChunkMD5 = async () => {
        // 針對單個文件進(jìn)行chunk上傳
        for (var i = 0; i < chunkCount; i++) {
            const { chunk } = getChunkInfo(file, i, chunkSize)
            console.log("總片數(shù)" + chunkCount)
            console.log("分片后的數(shù)據(jù)---測試:" + i)
            await uploadChunk({ chunk, currentChunk: i, chunkCount })
        }
    }
    const uploadChunk = (chunkInfo) => {
        // progressFun()
        return new Promise((resolver, reject) => {
            let config = {
                headers: {
                    'Content-Type': 'multipart/form-data'
                }
            }
            // 創(chuàng)建formData對象,下面是結(jié)合不同項目給后端傳入的對象。
            let fetchForm = new FormData()
            fetchForm.append('chunkNumber', chunkInfo.currentChunk + 1)  // 第幾片
            fetchForm.append('chunkSize', chunkSize)  // 分片大小的限制  例如限制 5M
            fetchForm.append('currentChunkSize', chunkInfo.chunk.size)  // 每一片的大小
            fetchForm.append('file', chunkInfo.chunk)   //每一片的文件
            fetchForm.append('filename', file.name)  // 文件名 
            fetchForm.append('totalChunks', chunkInfo.chunkCount) //總片數(shù)
            fetchForm.append('md5', fileMD5)
            upload(fetchForm, config).then(res => {
                console.log("分片上傳返回信息:", res)
                if (res.data.code == 1) {
                    // // 結(jié)合不同項目 將成功的信息返回出去
                    // 下面如果在項目中沒有用到可以不用打開注釋
                    uploading(chunkInfo.currentChunk + 1, chunkInfo.chunkCount)
                    resolver(true)
                } else if (res.data.code == 2) {
                    if (chunkInfo.currentChunk < chunkInfo.chunkCount - 1) {
                        console.log("分片上傳成功")
                    } else {
                        // 當(dāng)總數(shù)大于等于分片個數(shù)的時候
                        if ((chunkInfo.currentChunk + 1) == chunkInfo.chunkCount) {
                            console.log("文件開始------合并成功")
                            success(res.data)
                        }
                    }
                }
            }).catch((e) => {
                error && error(e)
            })
        })
    }
    readFileMD5() // 開始執(zhí)行代碼
}

后端代碼

控制器

/**
     * 視頻分片上傳
     * @return mixed
     */
    public function videoUpload()
    {
        $data = $this->request->postMore([
            ['chunkNumber', 0],//第幾分片
            ['currentChunkSize', 0],//分片大小
            ['chunkSize', 0],//總大小
            ['totalChunks', 0],//分片總數(shù)
            ['file', 'file'],//文件
            ['md5', ''],//MD5
            ['filename', ''],//文件名稱
        ]);
        $res = $this->service->videoUpload($data, $_FILES['file']);
        return app('json')->success($res);
    }

方法

/**
     * 視頻分片上傳
     * @param $data
     * @param $file
     * @return mixed
     */
    public function videoUpload($data, $file)
    {
        $public_dir = app()->getRootPath() . 'public';
        $dir = '/uploads/attach/' . date('Y') . DIRECTORY_SEPARATOR . date('m') . DIRECTORY_SEPARATOR . date('d');
        $all_dir = $public_dir . $dir;
        if (!is_dir($all_dir)) mkdir($all_dir, 0777, true);
        $filename = $all_dir . '/' . $data['filename'] . '__' . $data['chunkNumber'];
        move_uploaded_file($file['tmp_name'], $filename);
        $res['code'] = 0;
        $res['msg'] = 'error';
        $res['file_path'] = '';
        if ($data['chunkNumber'] == $data['totalChunks']) {
            $blob = '';
            for ($i = 1; $i <= $data['totalChunks']; $i++) {
                $blob .= file_get_contents($all_dir . '/' . $data['filename'] . '__' . $i);
            }
            file_put_contents($all_dir . '/' . $data['filename'], $blob);
            for ($i = 1; $i <= $data['totalChunks']; $i++) {
                @unlink($all_dir . '/' . $data['filename'] . '__' . $i);
            }
            if (file_exists($all_dir . '/' . $data['filename'])) {
                $res['code'] = 2;
                $res['msg'] = 'success';
                $res['file_path'] = $dir . '/' . $data['filename'];
            }
        } else {
            if (file_exists($all_dir . '/' . $data['filename'] . '__' . $data['chunkNumber'])) {
                $res['code'] = 1;
                $res['msg'] = 'waiting';
                $res['file_path'] = '';
            }
        }
        return $res;
    }

在實現(xiàn)分片上傳的過程,需要前端和后端配合,比如前后端的上傳塊號的文件大小,前后端必須得要一致,否則上傳就會有問題。其次文件相關(guān)操作正常都是要搭建一個文件服務(wù)器的,比如使用fastdfs、hdfs等。

本示例代碼在電腦配置為4核內(nèi)存8G情況下,上傳24G大小的文件,上傳時間需要30多分鐘,主要時間耗費在前端的md5值計算,后端寫入的速度還是比較快。

如果項目組覺得自建文件服務(wù)器太花費時間,且項目的需求僅僅只是上傳下載,那么推薦使用阿里的oss服務(wù)器,其介紹可以查看官網(wǎng):

https://help.aliyun.com/product/31815.html

阿里的oss它本質(zhì)是一個對象存儲服務(wù)器,而非文件服務(wù)器,因此如果有涉及到大量刪除或者修改文件的需求,oss可能就不是一個好的選擇。

以上就是視頻分片上傳的前后臺的所有代碼,其中有需求小伙伴可以自行加入視頻上傳驗證,斷點續(xù)傳等操作。文章來源地址http://www.zghlxwxcb.cn/news/detail-498438.html

到了這里,關(guān)于大文件分片上傳的實現(xiàn)【前后臺完整版】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • ElasticSearch如何在前后臺啟動

    進(jìn)入es的目錄 bin/elasticsearch Ctrl + C停止進(jìn)程 進(jìn)入es的目錄 bin/elasticsearch -d 1.查看端口9200被哪個進(jìn)程占用 sudo lsof -it tcp:port 例如:sudo lsof -it tcp:9200 或者直接查看es的進(jìn)程 ps - ef | grep elasticsearch 2.kill相應(yīng)進(jìn)程 sudo kill -9 pid 例如:sudo kill -9 987

    2024年02月16日
    瀏覽(23)
  • 關(guān)于單片機的前后臺系統(tǒng)

    關(guān)于單片機的前后臺系統(tǒng)

    單片機裸機系統(tǒng),通常又被稱為前后臺系統(tǒng)。 百度百科中,對前后臺系統(tǒng)有一段解釋: ?前后臺系統(tǒng),即計算機前后臺系統(tǒng),早期的嵌入式系統(tǒng)中沒有操作系統(tǒng)的概念,程序員編寫嵌入式程序通常直接面對裸機及裸設(shè)備,在這種情況下,通常把嵌入式程序分成兩部分,即前

    2024年02月12日
    瀏覽(22)
  • 如何判斷Android應(yīng)用置于前后臺

    ? ? ? ? 項目開發(fā)過程中總會遇到判斷應(yīng)用程序是否置于后臺或者從后臺切換到前臺。往往在切換的時候應(yīng)用會通過請求接口更新頁面展示數(shù)據(jù)或者提示廣告信息等相關(guān)操作。因此對于開發(fā)者來說判斷應(yīng)用程序前后臺狀態(tài)還是比較重要的。下面記錄兩種判斷應(yīng)用前后臺狀態(tài)的

    2024年02月12日
    瀏覽(27)
  • android 監(jiān)聽app前后臺切換

    需求是統(tǒng)計app使用時長,要求在按home鍵的時候也算一次完成的使用記錄。剛開始打算采用監(jiān)聽home鍵點擊,尋求的方法是監(jiān)聽系統(tǒng)廣播。 可以實現(xiàn)監(jiān)聽home鍵被點擊,但有一個弊端就是點擊home鍵app切換到后臺后,在使用別的app點擊home鍵 自己的app還是會收到這個廣播,因為這是

    2024年02月11日
    瀏覽(24)
  • 一個面向MCU的小型前后臺系統(tǒng)

    一個面向MCU的小型前后臺系統(tǒng)

    JxOS面向MCU的小型前后臺系統(tǒng),提供消息、事件等服務(wù),以及軟件定時器,低功耗管理,按鍵,led等常用功能模塊。 gitee倉庫地址為(復(fù)制到瀏覽器打開): 在此基礎(chǔ)上實現(xiàn)了基于433的簡單無線網(wǎng)絡(luò)功能。 此項目的 設(shè)計思想 是:功能模塊與硬件高度解耦,提高代碼模塊的可

    2024年02月09日
    瀏覽(19)
  • 【jenkins部署】一文弄懂自動打包部署(前后臺)

    【jenkins部署】一文弄懂自動打包部署(前后臺)

    軟件開發(fā)中,會分多個環(huán)境,開發(fā)環(huán)境、測試環(huán)境、預(yù)發(fā)布環(huán)境、生產(chǎn)環(huán)境,軟件部署如果是純?nèi)斯ひ粋€個通過jar的方式, 會有如下問題: 服務(wù)器過多,容易出錯 修改配置,可能會存在未修改到位的情況 服務(wù)器部署權(quán)限一般只有開發(fā)服務(wù)器人才有權(quán)限,涉及到服務(wù)器的安全

    2024年02月08日
    瀏覽(23)
  • centos配置nginx+node前后臺+mongodb

    centos 環(huán)境下安裝

    2024年02月11日
    瀏覽(23)
  • 前后臺傳遞參數(shù)中出現(xiàn)+、-、=、%、&、#、空格等字符的解決思路

    一、描述問題 前后臺傳輸數(shù)據(jù)多樣化,可能會出現(xiàn)特殊字符的情況,比如傳遞的參數(shù)中含有+、空格、=、%等字符,遇到這樣的情況我們該如何解決呢? 二、問題分析 前后臺特殊字符對其編碼,原因可能是這些特殊字符對于前后臺傳遞參數(shù)的時候,有其特殊的用途,比如url中

    2024年01月17日
    瀏覽(20)
  • 【SpringMVC】統(tǒng)一異常處理 前后臺協(xié)議聯(lián)調(diào) 攔截器

    【SpringMVC】統(tǒng)一異常處理 前后臺協(xié)議聯(lián)調(diào) 攔截器

    1. 問題描述 在講解這一部分知識點之前,我們先來演示個效果,修改BookController類的 getById 方法 重新啟動運行項目,使用PostMan發(fā)送請求,當(dāng)傳入的id為1,則會出現(xiàn)如下效果: 前端接收到這個信息后和之前我們約定的格式不一致,這個問題該如何解決? 在解決問題之前,我們

    2024年02月11日
    瀏覽(23)
  • 一套前后臺全部開源的H5商城送給大家

    博主給大家推薦一套全部開源的H5電商項目 waynboot-mall 。由博主在2020年開發(fā)至今,已有三年之久。那時候網(wǎng)上很多的H5商城項目都是半開源版本,要么沒有H5前端代碼,要么需要加群咨詢,屬實惡心。于是博主決定自己開發(fā)一套完整的移動端H5商城,包含一個管理后臺、一個前

    2024年02月02日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包