使用websocket上传视频文件后无法播放


前端将一个100多M的视频文件切片后使用websocket发送给后端,后端(Go语言)将接收到的数据保留到磁盘上.
接下来发现发后端接受完数据后,本地播放器(不是HTML或Flash播放器)无法正常播放该视频文件,但播放上传之前的原视频文件则正常.

原视频文件和后端接收后保存到磁盘上的视频文件,大小相同(能精确到字节数,是不是能说明传输过程中数据没丢?)

但是对原视频和后端接受到的视频进行MD5检查,MD5值不一样.

我感觉是后端处理数据的时候出现了问题,有没有遇到过类似问题的同学?


[更新:]
下了一个1M以下的视频文件进行上传,发现一切正常.
又上传了11M大小的PDF文件,问题出现,两个文件的字节数相等,但MD5不等.
推测是js的代码有问题,可能是切片的时候应该严格按照字节来切.
(下面js代码中,最后一次slice的范围会超过文件的大小)


下面是部分核心代码:

upload.js

function upload() {
        var slicesize = 1024 * 1024 * 5;
        var file = document.getElementById("file").files[0];
        var ws = new WebSocket("ws://127.0.0.1:8080/file");
        var startsize = 0;
        var endsize = 0;
        var count = 0;
        ws.onopen = function () {
            console.log("成功连接到服务器");
            ws.send(file.name);
            console.log("size : ", file.size);
            console.log("name size : ", file.name.length)
        };
        ws.onmessage = function (resp) {
            //console.log("收到来自服务器的信息: ", resp.data);
            if (resp.data) {
                var sent = parseInt(resp.data);
                var percent = sent / file.size * 100;
                //console.log("percent:", percent, "%");
                $('#progress').attr("style", "width: " + percent.toFixed(2) + "%");
                $('#progress').text(percent.toFixed(2) + "%");
                if (count == 0) {
                    ws.send(file.size);
                    count++
                }
                if (endsize < file.size) {
                    console.log("test");
                    startsize = endsize;
                    endsize += slicesize;
                    var blob = file.slice(startsize, endsize);
                    var reader = new FileReader();
                    reader.readAsArrayBuffer(blob);
                    reader.onload = function loaded(event) {
                        var arrayBuffer = event.target.result;
                        ws.send(arrayBuffer);
                        console.log("发送切片");
                        arrayBuffer = null;
                    }

                } else {
                    //console.log("已发送: ", endsize);
                    startSize = endSize = 0;
                    //ws.send("~");
                    //console.log("全部发送完成!")
                }
            }
        };
        ws.onclose = function () {
            console.log("成功关闭了连接");
            loadMovie()
        }
    }

upload.go

func UploadFile(ws *websocket.Conn) {
    var err error
    var count int
    var filename string
    var filesize int
    var savepath string
    recData := bytes.NewBuffer([]byte{})
    for {
        var receive []byte
        if err = websocket.Message.Receive(ws, &receive); err != nil {
            log.Fatal(err)
            break
        }
        if count == 1 {
            filesize, err = strconv.Atoi(string(receive))
            fmt.Println("文件大小: ", filesize)
        } else if count == 0 {
            filename = string(receive)
            fmt.Println("文件名为: ", filename)
        } else {
            recData.Write(receive)
        }
        count++
        sent := strconv.Itoa(len(recData.Bytes()))
        //fmt.Println("sent:", sent)
        //fmt.Println("本次接受到的文件长度为: ", len(receive))
        //fmt.Println("当前文件总长度: ", len(recData.Bytes()))
        if err = websocket.Message.Send(ws, sent); err != nil {
            log.Fatal(err)
            break
        }
        if len(recData.Bytes()) == filesize && sent != "0" {
            break
        }
    }
    wd, err := os.Getwd()
    if err != nil {
        log.Fatal(err)
    }
    savepath = path.Join(wd, "static", "upload")
    movie := Movie{
        Name: filename,
        Path: savepath,
        Size: filesize,
        Time: time.Now().Format("2006-01-02 15:04:05"),
    }
    fp, err := os.Create(path.Join(savepath, movie.Time + movie.Name))
    if err != nil {
        log.Fatal(err)
    }
    defer fp.Close()

    fmt.Println("文件总大小: ", len(recData.Bytes()))
    recData.WriteTo(fp)
}

另外附上前几天提问的另外一个问题给有需要的同学,同一份代码

无法控制Websocket的send和receive事件


问题找到啦, 自己来解答下.

js代码没问题,问题出现在Go这个包上 a bug in the x/net/websocket package

我用github.com/gorilla/websocket替换掉它就OK了.



相关阅读:
作用域链的问题?
angular.js高级程序设计书本开头配置环境出错,谁能给解答一下
样式和类样式区别
关于this在浏览器中的指向
在node.js里面可以使用window对象的方法吗
angularjs如何将字符串类型的时间格式化呢
bundle-loader解析import异于ES6 module
video标签怎么控制播放内容的宽高?
IE兼容 React
弹出提示窗口JS怎么设置弹出一次,假设多弹出也要把前者取消,让后者弹出一次?
前端如何掌握必须的http知识?
在pfsense中启动barnyard2失败
scrapy怎么设置返回码不是200换代理
为什么有的公司要求DBA禁止使用between?
Laravel 如何获取路由名称?
前后端分离中碰到跨域问题大家是怎么解决的?
阮一峰老师《ECMAScript 6入门》第一节中的疑问
定时器中this为什么会指向window
backbone排序问题,视图实时排序
vuex中的state值,在工具类模块中怎么获取?



快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 木棉依旧笑春风 工作委员会“严以用权”学习研讨会发言稿 小学二年级下学期班主任工作计划 中考满分作文:距离产生美作文1200字 绿意融融感舒心300字 中学招生年终工作总结 曾经忆起过作文300字 你真行 2016中考作文预测与范文2篇:法律在身边 我也学会了煮饭350字 原来我是 2010年镇民生工作小结 开展集中学习和作风纪律整顿活动的个人总结 小学四年级作文500字:勇捅马蜂窝 《传统工业区与新工业区》教学设计 优秀农民入党申请书实例 审计部门科学发展观分析检查报告 一次不经意的一瞥 人,要有多个支点作文1000字 天使般微笑 爱心树读后感500字 先进事迹演讲稿 为奉献插上激情的翅膀 早春闲居 卓越是人生的境界 董思阳写给大学生的六条忠告 我知道,你很用力的爱着我作文200字 不喜勿入       les微小说【三】 有时我也想有人陪作文600字 26岁,我4年职场路程_职场励志 悄悄转身,勿忘我 心事如尘,碾成泥 快乐到家 我只是一个女孩 关于学习好词好句 生命的涌动作文850字 与其太多心,不如少根筋 电仪车间上半年工作总结及下半年工作计划-部门工作总结_部门工作总结 寒假的生活作文500字 幻实 企业劳务派遣合同 学法懂法心得体会 原来,我也很坚强作文700字 新婚祝福话 未来的万能书包 回忆中的青春 2009年度副校长德育工作述职报告 年里年外作文1600字 师德师风教育活动心得 春运服务明星事迹材料 交通安全我能行作文900字

Copyright © 2016 phpStudy |