zoukankan      html  css  js  c++  java
  • Webupload+PHP上传大文件

    一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不能这样上传了。我这里分享一下我自己开发的一套大文件上传控件供大家参考

    这是前端代码:

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

    ?>

     

    文件和文件夹批量上传

    说明: http://bbsres2.ncmem.com/202d5f59.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);
    ?>

     

     

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

     

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

     

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


     

     

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

     

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

     

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

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

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

     

    数据库记录

    说明: http://bbsres2.ncmem.com/b886fdb7.png

     

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

  • 相关阅读:
    【转】一个java处理JSON格式数据的通用类
    Oracle数据类型Clob读取
    【网摘】Ibatis调用存储过程
    jQuery实现页面模块拖拽与模块自定义效果.rar
    jspSmartUpload上传下载全攻略
    【转】JSON 入门指南
    【摘选自江苏移动网上营业厅】JS实现无间断向上滚动marquee
    Oracle用户解锁
    js 蒙版进度条(图片)
    java文件夹遍历
  • 原文地址:https://www.cnblogs.com/xproer/p/10936777.html
Copyright © 2011-2022 走看看