zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    【刷题】洛谷 P2764 最小路径覆盖问题
    【刷题】BZOJ 3546 [ONTAK2010]Life of the Party
    【刷题】BZOJ 3175 [Tjoi2013]攻击装置
    【刷题】BZOJ 4516 [Sdoi2016]生成魔咒
    【刷题】SPOJ 1811 LCS
    【刷题】洛谷 P3804 【模板】后缀自动机
    【刷题】SPOJ 8222 NSUBSTR
    (98)Wangdao.com_第三十天_拖拉事件
    ECMA Script 6_必须要知道的基础
    (97)Wangdao.com_第三十天_触摸事件
  • 原文地址:https://www.cnblogs.com/xproer/p/10949108.html
Copyright © 2011-2022 走看看