html5——文件断点续传

  一直以来我都特别好奇,网上很多文件断点上传是怎么实现的,像百度云,最近看到一篇关于HTML5新特性的文章,里面的BLOB对象和FILE对象,有一个slice方法,可以将BLOB对象进行分割。BLOB(Binary Large Object)二进制大对象,属于XMLHttpRequest2.0中的一员,它的slice方法和字符串和数组的slice方法一样,用于分割二进制。

  文件上传后台我是使用php的,上传的策略是先请求后台询问上传的文件是否存在,如果存在则发回已经上传到哪里。然后前端拿到这个位置,对文件二进制进行分割。

  好,先看看我前端的实现,后台写得太烂,我就不贴出来了,php的文件主要使用两个函数,一个是file_put_contents,还有就是file_get_contents

<!DOCTYPE html>
<html>
<head>
    <title>断点续传</title>
</head>
<style type="text/css">
    input[type="file" i] {
        width: 100px;
        height: 50px;
        opacity: 0;
        /*visibility: hidden;*/
        margin: 0;
        padding: 0;
        border: 0;
        float: left;
    }
    .upload-button-wrap {
        position: relative;
        display: inline-block;
        vertical-align: middle;
    }
    .upload-button-wrap:hover .upload-button {
        border-color: #000;
    }
    .clearfix:after {
        content: ‘‘;
        clear: both;
        display: block;
    }
    .clearfix {
        zoom: 1;
    }
    .upload-button {
        width: 100px;
        height: 50px;
        position: absolute;
        left: 0;
        top: 0;
        z-index: -1;
    }
    .upload-wrap {
        position: relative;
    }
    #uploadButton {
        display: inline-block;
    }
</style>
<body>
    <div class="upload-wrap">
        <div class="upload-button-wrap clearfix">
            <input type="file" id="uploadFile">
            <button class="upload-button">选择图片</button>
        </div>
        <button id="uploadButton">上传</button>
    </div>
<script type="text/javascript">
    (function (w) {
        var fileUpload = function (config) {
            var _files = [],    // 要上传文件的队列
                _file = null,    // 当前上传的文件
                _upload = config.uploadId,    // input[type = "file"]的控件ID
                _submit = config.submitId,    // input[type = "submit"]的控件ID
                _url = config.url,
                _unit = 1024,
                _start = 0,
                _xmlRequest = new XMLHttpRequest();

            var _init = function () {
                document.getElementById(_upload).addEventListener("change", function (e) {
                    _files = this.files;
                    _file = _files[0];
                    e.preventDefault();
                }, false);
                document.getElementById(_submit).addEventListener("click", function (e) {
                    // 向后抬请求文件是否存在
                    _xmlRequest.onload = function () {
                        if (_xmlRequest.readyState == 4 && _xmlRequest.status == 200) {
                            _start = parseInt(_xmlRequest.responseText);
                            _uploadFile();
                        }
                        _xmlRequest.onload = function () {
                            if (_xmlRequest.readyState == 4 && _xmlRequest.status == 200) {
                                if (_xmlRequest.responseText == "success") {
                                    _start = _start + _unit;
                                    _uploadFile();
                                }
                            }
                        }
                    };
                    _getSetbacks();
                    e.preventDefault();
                }, false);
            },
            // 获取文件进度
            _getSetbacks = function () {
                _xmlRequest.open("GET", _url+"?fileName="+_file.name, true);
                _xmlRequest.send(null);
            },
            // 上传文件
            _uploadFile = function () {
                if (_start > _file.size) return;
                console.log(_start);
                var formData = new FormData();
                formData.append(‘fileName‘, _file.name);
                formData.append(‘fileContent‘, _file.slice(_start,_start+_unit));
                _xmlRequest.open("POST", _url, true);
                _xmlRequest.send(formData);
            };

            _init()
        }

        w.fileUpload = fileUpload;

    })(window)
    var f = new fileUpload({
        uploadId: ‘uploadFile‘,
        submitId: ‘uploadButton‘,
        url: ‘./upload.php‘
    })
</script>
</body>
</html>

  我先请求后台,通过_getSetback函数获取文件进度,返回的是已经上传文件的大小,然后根据文件大小对文件进行切分(slice),最后通过_uploadFile分多次上传文件。

时间: 2024-10-10 15:42:41

html5——文件断点续传的相关文章

HTML5 大文件断点续传完整思路整理

需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构. 支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输.关闭浏览器后保留进度信息. 支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同. 支持断点续传,关闭浏览器或刷新浏览器后仍然能够保留

文件上传控件-如何上传文件-大文件断点续传

需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Windows,Mac,Linux 支持所有浏览器. 支持文件批量上传 支持文件夹上传,且要求在服务端保留层级结构.文件夹数量要求支持到10W. 支持大文件断点续传,要求刷新浏览器,重启浏览器,重启电脑后仍然能够继续上传.文件大小要求能够支持到20个G. 支持自动加载本地文件,要求能够自动加载指定的本地文件.

基于HT for Web矢量实现HTML5文件上传进度条

在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件上传进度条,矢量在<矢量Chart图表嵌入HTML5网络拓扑图的应用>一文中已经讲述了关于setCompType()方法的应用,今天我们用setImage()方法充分利用系统中定义好的矢量资源来实现文件上传进度条,我们先来看下效果图: 从效果图可以看到,向服务器上传了一个mp4文件,并在最下方显示

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但是用起来也是很方便的.iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理.    输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:    代码关键词: 1.在接收到响应头的代理

HTML5 文件上传

HTML5 文件上传 1 filelist对象与file对象: 1 <input type="file" id="file" multiple> //multiple可上传多个文件 2 <input type="button" onclick="showFileName()" value="文件上传"> 3 <script> 4 function showFileName

iOS项目中如何正确引入Html5文件(html/js/css)

iOS项目中使用项目中的html js css 文件时,有时会遇到引用路径出错的问题,导致html js css image文件无法加载的情况. 那么,引入H5相关文件的正确操作方式如下,这样就不会出现资源文件无法引入并正常使用的情况: 1 在项目目录下创建存放Html5文件文件夹:H5 2 将文件夹H5拖放至项目中对应的位置,此处注意要选择:Create groups 3 将各种Html5文件(html js css image等)拖放到H5文件夹中,此处注意选择:Create folder

HTML5文件上传组件美化jQuery插件

简要教程 jQuery.filer是一款简单的HTML5文件上传组件美化jQuery插件.它能够完成单文件和多文件的上传,支持文件的拖拽,支持不同的文件格式校验,支持缩略图和图标等,是一款非常实用的文件上传插件.它的特点还有: 对文件上传File Input组件进行美化 支持多文件上传 支持校验文件:大小,扩展名等 支持创建文件的缩略图 每种类型的文件可以自定义图标 可以为缩略图,图标和input自定义模板和主题 可以移出已选择的文件 可以从剪切板粘贴图片 所有的图标在一个字体文件中 支持文件拖

html5文件上传

<!DOCTYPE html><html><head> <title>Html5 Ajax 上传文件</title></head><body> <progress id="progressBar" value="0" max="100"> </progress> <span id="percentage">&

html5实现大文件断点续传

项目中实现的html5断点续传. 使用spark-md5.js计算文件MD5值,resumable.js和file api实现断点续传.后台使用java接收文件流, 不支持html5的浏览器使用插件进行断点续传. 以下是html5的demo: