Javascript 简单的视频上传系统,带有gridfs流,可直接在iOS上录制视频,但在从手机选择视频时不起作用';s画廊

Javascript 简单的视频上传系统,带有gridfs流,可直接在iOS上录制视频,但在从手机选择视频时不起作用';s画廊,javascript,ios,node.js,gridfs,gridfs-stream,Javascript,Ios,Node.js,Gridfs,Gridfs Stream,我正在尝试用gridfs流构建一个非常基本的视频上传系统。 它可以在桌面上工作,但只能在我的手机上部分工作(iOS9 iphone 5,使用Chrome浏览器) 使用直接录制iOS功能(录制不在照片库中且未保存的视频)它可以完美地工作,但当我尝试在照片库中选择保存的视频时,视频无法正确上载 在写入数据库之前保存到临时目录时,文件为空(大小:0kb) fs.chunks集合中未保存任何块 fs.files集合中的“length”属性为0 它不会显示,就像文件不存在一样 代码如下: functi

我正在尝试用gridfs流构建一个非常基本的视频上传系统。 它可以在桌面上工作,但只能在我的手机上部分工作(iOS9 iphone 5,使用Chrome浏览器)

使用直接录制iOS功能(录制不在照片库中且未保存的视频)它可以完美地工作,但当我尝试在照片库中选择保存的视频时,视频无法正确上载

  • 在写入数据库之前保存到临时目录时,文件为空(大小:0kb)
  • fs.chunks集合中未保存任何块
  • fs.files集合中的“length”属性为0
  • 它不会显示,就像文件不存在一样
代码如下:

function saveVideo(file){
    var name         = file.filename.split('.').slice(0, -1),
        extension    = file.filename.split('.').pop(),
        randomString = Math.random().toString(36).substring(7);

    file.filename = name + '_' + randomString + '.' + extension;

    var writeStream = gridFs.createWriteStream({
        filename: file.filename,
        metadata: {
            validated: false
        }
    });

    fs.createReadStream(file.file).pipe(writeStream);

    writeStream.on('close', function(){
        fs.unlink(file.file);
    });
}

app.post('/addVideo', function(req, res){
    var files = req.files['file-input'];

    if (files.length){
        files.forEach(function (file, index){
            saveVideo(file);

            if (index == files.length - 1){
                res.redirect('/admin')
            }
        });
    }

    else {
        if (files.filename){
            saveVideo(files);
        }

        res.redirect('/admin');
    }
 });

app.get('/videos/:filename', function(req, res){
    gridFs.exist({'filename': req.params.filename}, function(err, found){
        if (err){
            return next(err);
        }

        if (found){
            var readStream = gridFs.createReadStream({
                filename: req.params.filename
            });

            readStream.pipe(res);
        }

        else {
             res.status(404).send('Not Found');
        }
     });
 });
我想到的事情:

  • 使用照片而不是视频确实有效,但我需要我的webapp能够接收视频

  • 直接录制和从多媒体资料中选择视频可能有区别?我真的不明白,因为除了iOS自动分配的名称之外,我没有看到任何名称。我试图强制使用特定的mimetype/编码,但我真的不知道该怎么做,也没能成功。(老实说,我甚至不知道它是如何工作的)

  • 使用另一个浏览器:奇怪的是,当使用Safari而不是Chrome mobile时,文件在写入数据库之前会正确地放入临时目录。之后显示不正确(视频大小不正确,有黑色背景占位符,就像视频不存在一样,但我可以右键单击chrome inspector中的链接并在新窗口中打开它,导致文件下载。视频没有损坏,文件不是“空的”数据库中的长度属性也不像从Chrome上传时那样(视频确实有效)

  • 如果有帮助的话,当使用直接录制功能在Chrome上提交我的表单时,它会重新加载页面,输入是空的。当从库中选择文件时,它会花费更多的时间,但它不会重新加载页面,文件仍然在输入中,就像它没有做任何事情一样。加载栏确实会出现,并停止我在中间。这是我正在使用的代码。我尝试了多个版本(例如使用capture属性),但都不起作用。我正在使用express busboy模块解码表单的数据