背景:50G大文件的HTTP上传至服务器。
好了,根据这个命题,可以开始研究我们怎么做才能把这么大的文件上传成功。
分片上传是肯定的,断点续传也是要有的,进度可视化那就更好了,基于这些,我选择了Webuploader在前端进行分片上传。
为什么选择它呢,好吧,它简单,易上手,好排错,文档多......
实际是我懒......
网上的教程大部分是复制粘贴,借鉴起来也很无奈,推荐一个我觉得比较实在的
https://www.cnblogs.com/baiyunchen/p/5383507.html
本篇Demo地址,欢迎各位大佬指点
这是前端代码:
<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" />
<input id="btnUpF" type="button" value="上传本地文件" />
</p>
<p>
目录路径:<input id="folderPath" type="text" size="50" value="C:\\Users\\Administrator\\Desktop\\test" />
<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());
?>
文件和文件夹批量上传
当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件。另外分片传输能够更加实时的跟踪上传进度。
上传成功后打开我们的存储文件夹查看,发现自动生成了几个文件夹,打开文件夹确认上传文件成功
文件及文件夹批量下载
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);
?>
首先勾选多个上传的文件或文件夹,你会发现多了一个下载按钮
然后点击下载按钮,设置下载目录文件夹
设置完成后继续点击下载按钮,页面的右下角出现了下载面板,你选择的文件已出现在目录中,然后点击全部下载,或者单个点击继续,自动加载未上传完的任务。在刷新浏览器或重启电脑后任然可以自动加载未完成的任务
下载完成后打开我们设置的下载目录文件夹,发现需下载的文件或文件夹确认已下载成功,经确认文件夹内的内容与下载文件夹内容一致