Простая система загрузки видео с gridfs-stream работает с прямой записью iOS, но не при выборе видео из галереи телефона

Я пытаюсь создать очень простую систему загрузки видео с помощью gridfs-stream. Это работает на рабочем столе, но только частично на моем телефоне (iOS9 iphone 5, используя браузер Chrome).

Он отлично работает, используя функцию прямой записи iOS (запись видео, которого нет в фотогалерее, и без его сохранения), но когда я пытаюсь выбрать сохраненное видео в фотогалерее, оно загружается неправильно.

  • При сохранении во временный каталог перед записью в базу данных файл пуст (размер: 0 КБ)
  • В коллекции fs.chunks не сохраняются фрагменты
  • Атрибут "length" в коллекции fs.files равен 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');
        }
     });
 });

Вещи, о которых я думал:

  • Использование фотографий вместо видео работает, но мне нужно мое веб-приложение, чтобы иметь возможность получать видео.

  • Может быть, есть разница между прямой записью и выбором видео из галереи? Я действительно не понимаю, потому что кроме имени, которое автоматически присваивается iOS, я не вижу ни одного. Я пытался форсировать определенный mimetype/encoding, но я не был уверен, как это сделать, и не смог заставить его работать. (Я даже не уверен, как это работает, если честно)

  • Использование другого браузера: как ни странно, при использовании Safari вместо Chrome mobile файл должным образом помещается во временный каталог перед записью в базу данных. После этого он не отображается должным образом (у видео нет нужного размера, и есть черный фоновый заполнитель, как если бы видео не существовало, но я могу щелкнуть правой кнопкой мыши ссылку в Chrome Inspector и открыть его в новом окне, что приводит к загрузке файла. Видео не повреждено, файл не является "пустым", а также не является атрибутом длины в базе данных, как при загрузке из Chrome (видео работает).

  • Если это может помочь, при отправке моей формы в Chrome с использованием функции прямой записи, она перезагружает страницу и ввод пуст. При выборе файла из галереи требуется немного больше времени, но он не перезагружает страницу, а файл все еще находится на входе, как будто он ничего не делал. Панель загрузки появляется и останавливается посередине. Это код, который я использую. Я пробовал несколько версий (например, используя атрибут capture), но это не сработало. Я использую модуль express-busboy для декодирования данных формы.

<form action="/addVideo" method="POST" enctype="multipart/form-data">
  <input type="file" accept="video/*" multiple name="file-input"/>
  <input type="submit"/>
</form>

  • Я попытался использовать модуль connect-busboy вместо express-busboy (он не записывает файлы перед их добавлением, он напрямую передает их в базу данных), но проблема все еще возникает.

Благодарю.

0 ответов

Другие вопросы по тегам