使用Webuploader大文件分片传输 ​

背景:50G大文件的HTTP上传至服务器。

好了,根据这个命题,可以开始研究我们怎么做才能把这么大的文件上传成功。

分片上传是肯定的,断点续传也是要有的,进度可视化那就更好了,基于这些,我选择了Webuploader在前端进行分片上传。

为什么选择它呢,好吧,它简单,易上手,好排错,文档多......

实际是我懒......

网上的教程大部分是复制粘贴,借鉴起来也很无奈,推荐一个我觉得比较实在的

https://www.cnblogs.com/baiyunchen/p/5383507.html

本篇Demo地址,欢迎各位大佬指点

https://dwz.cn/fgXtRtnu

 

这是前端代码:

<body>

    <p>up6多文件上传演示页面</p>

    <p><a target="_blank" href="db/clear.php">清空数据库</a></p>

    <p><a href="filemgr/index.php" target="_blank">文件管理器演示</a></p> 

    <p><a target="_blank" href="index2.php">单面板演示</a></p>

    <p><a href="down2/index.htm" target="_blank">打开下载页面</a></p>

    <p>

        文件路径:<input id="filePath" type="text" size="50" value="D:\\360safe-inst.exe" />&nbsp;

        <input id="btnUpF" type="button" value="上传本地文件" />

    </p>

    <p>

        目录路径:<input id="folderPath" type="text" size="50" value="C:\\Users\\Administrator\\Desktop\\test" />&nbsp;

        <input id="btnUpFd" type="button" value="上传本地目录" />

    </p>

    <div id="FilePanel"></div>

 

这是后台部分代码和截图:

文件上传完毕,f_complete.

文件初始化,f_create

文件块处理,f_post

文件夹上传完毕,fd_complete

文件夹初始化,fd_create

us

 

PHP上传代码

<?php

ob_start();

header('Content-Type: text/html;charset=utf-8');

/*

    控件每次向此文件POST数据

    逻辑:

        1.更新数据库进度

        2.将文件块数据保存到服务器中。

    更新记录:

        2014-04-09 增加文件块验证功能。

        2014-09-12 完成逻辑。

        2014-09-15 修复返回JSONP数据格式错误的问题。

        2016-05-31 优化调用,DBFolder::Complete会自动更新文件表信息,所以在此页面不需要再单独调用DBFile::fd_complete

*/

require '../vendor/autoload.php';

require('biz/PathBuilder.php');

require('biz/PathBuilderUuid.php');

require('biz/up6_biz_event.php');

require('model/FileInf.php');

require('utils/fd_scan.php');

use database\DbHelper;

use database\DBFile;

use database\DBFolder;

$id     = $_GET["id"];

$uid    = $_GET["uid"];

$cbk    = $_GET["callback"];//jsonp

$ret    = 0;

//参数为空

if (    strlen($uid) > 0

    ||  strlen($id) >0  )

{

    $inf = new FileInf();

    $db = new DBFile();

    $db->read($id,$inf);

    $root = $inf->pathSvr;

    $fd = new DBFolder();

    $fd->Complete($id, $uid);

    $sa = new fd_scan();

    $sa->root = $inf;

    $sa->scan($inf,$root);

    $db->fd_scan($id, $uid);

    up6_biz_event::folder_post_complete($id);

    $ret = 1;

}

echo "$cbk( $ret )";

header('Content-Length: ' . ob_get_length());

?>

文件和文件夹批量上传

说明: https://i-blog.csdnimg.cn/blog_migrate/d320c6d5f590b288cd04240a78df890b.png

 

当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件。另外分片传输能够更加实时的跟踪上传进度。

 

上传成功后打开我们的存储文件夹查看,发现自动生成了几个文件夹,打开文件夹确认上传文件成功

 

文件及文件夹批量下载

PHP部分下载代码及截图:

 

<?php

require('../../db/utils/HttpHeader.php');

require('../../db/utils/PathTool.php');

$head = new HttpHeader();

$id   = $head->param("id");

$blockIndex  = $head->param("blockIndex");

$blockOffset = $head->param("blockOffset");

$blockSize   = $head->param("blockSize");

$pathSvr   = $head->param("pathSvr");

$pathSvr  = PathTool::urldecode_path($pathSvr);

if ( empty($id) 

|| empty($blockIndex)

|| strlen($blockOffset) < 1

|| empty($blockSize)

|| empty($pathSvr) ) 

{

header('HTTP/1.1 500 param null');

return;

}

header("Cache-Control: public");

header("Content-Type: application/octet-stream");

header("Content-Length: $blockSize");

$readToLen = intval($blockSize);

$readLen = 0;

//windows系统中需要将中文转换为gb2312

$pathSvr = iconv( "UTF-8","GB2312",$pathSvr);

$file = fopen($pathSvr,"rb");

fseek($file,$blockOffset);

while( $readToLen > 1)

{

set_time_limit(0);

$len = min(1048576,$readToLen);

print( fread($file,$len ));

$readToLen -= $len;

flush();

ob_flush();

}

fclose($file);

?>

 

首先勾选多个上传的文件或文件夹,你会发现多了一个下载按钮

然后点击下载按钮,设置下载目录文件夹

设置完成后继续点击下载按钮,页面的右下角出现了下载面板,你选择的文件已出现在目录中,然后点击全部下载,或者单个点击继续,自动加载未上传完的任务。在刷新浏览器或重启电脑后任然可以自动加载未完成的任务

 

下载完成后打开我们设置的下载目录文件夹,发现需下载的文件或文件夹确认已下载成功,经确认文件夹内的内容与下载文件夹内容一致

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值