php上传文件夹 ​

用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个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 databaseDbHelper;

use databaseDBFile;

use databaseDBFolder;

 

$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());

?>

分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度。我们随机上传4个文件或文件夹

 

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

当重新打开网页时,只需要点击继续即可。

 

 上传完成后,我们发现页面上已出现相应的文件或文件夹名称

查看我们的数据库会发现已经新建了当天的日期文件夹,点击查看

 

会发现随机生成的4个文件夹并存放,打开发现确认是我们上传的原文件或文件夹

  

 

上传测试成功

 

文件下载

部分下载脚本文件与代码:

<?php

require('../../db/database/DbHelper.php');

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

require('../../db/model/FileInf.php');

require('../model/DnFileInf.php');

require('../biz/DnFile.php');

 

$id      = $_GET["id"];

$uid         = $_GET["uid"];

$fdTask = $_GET["fdTask"];

$nameLoc     = $_GET["nameLoc"];

$pathLoc     = $_GET["pathLoc"];

$lenSvr = $_GET["lenSvr"];

$sizeSvr     = $_GET["sizeSvr"];

$cbk         = $_GET["callback"];

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

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

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

 

if (  strlen($uid) < 1

    ||empty($pathLoc)

    ||empty($lenSvr))

{

    echo cbk . "({"value":null})";

    die();

}

 

$inf = new DnFileInf();

$inf->id = $id;

$inf->uid = intval($uid);

$inf->nameLoc = $nameLoc;

$inf->pathLoc = $pathLoc;

$inf->lenSvr = intval($lenSvr);

$inf->sizeSvr = $sizeSvr;

$inf->fdTask = $fdTask == "1";

 

$db = new DnFile();

$db->Add($inf);

 

$json = json_encode($inf,JSON_UNESCAPED_SLASHESJSON_UNESCAPED_UNICODE);

$json = urlencode($json);

$json = "$cbk({"value":"".$json.""})";//返回jsonp格式数据。

echo $json;

?>

 

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

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

我设置的是桌面的测试下载目录,设置好点击确定后,继续点击下载按钮,你会发现在页面的右下角出现了下载面板,你选择的文件已出现在目录中,然后点击全部下载,或者单个点击继续

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

下载功能测试成功

其他产品截图:

 

产品介绍官网:https://dwz.cn/fgXtRtnu

 

原文地址:https://www.cnblogs.com/xproer/p/10949108.html