NodeJs 读取服务器文件

本文介绍了一个Node.js项目的核心代码,实现了前端通过Ajax上传视频文件至服务器,服务器端利用Node.js接收并保存视频文件,同时支持视频文件的流传输返回给前端进行播放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NodeJs 读取视频文件

近期接到项目需求:用户上传自己录制的视频,然后可以在前端查看处理后的视频文件:

  • 前端上传视频
  • node接收并保存
  • node读取视频文件
  • node流传输

前端上传

用户录制自己的视频文件,并上传到服务器端:

代码块

前端使用jquery的ajax,核心代码:

                var oMyForm = new FormData(); // 创建一个空的FormData对象
                var videoBlob = new Blob(recordedBlobs, {
                    type: 'video/mp4'
                }); //blob对象存储视频数据
                oMyForm.append("videoData", videoBlob);
                oMyForm.append("timeFileName", newFileName);
                oMyForm.append("userFileName", fileName);
                oMyForm.append("interview", JSON.stringify(interview));

                $.ajax({
                    type: "POST",
                    url: "/study-video/video/upload",
                    data: oMyForm,
                    processData: false, //  告诉jquery不要处理发送的数据
                    contentType: false, // 告诉jquery不要设置content-Type请求头
                    success: function (msg) {
                        //上传中 隐藏
                        console.log(msg);
                    }
                });

node保存视频文件/读取后-流传输给前端

用户录制自己的视频文件,并上传到服务器端:

代码块

前端使用jquery的ajax,核心代码:

var router = require('express').Router();
var fs = require('fs');
var path = require('path');
const os = require('os');
var config = require('../config/index');
var interviewInner = config.interview.inner;
var proxy = require('../serviceProxy/proxy');
var http = require('http');
var request = require('request');

//busboy 文件处理请求
function handleFiles(req, res, next) {
    req.files = {};

    req.busboy.on('file', function (fieldName, file, fileName, encoding, mimeType) {
        if (!fileName) {
            return;
        }

        file.fileRead = [];

        console.log('uploading: ', fileName);
        console.log(file);
        file.on('data', function (data) {
            console.log('File [' + fieldName + '] got ' + data.length + ' bytes');
            file.fileRead.push(data);
        });

        file.on('end', function () {
            var finalBuffer = Buffer.concat(this.fileRead);

            req.files[fieldName] = {
                buffer: finalBuffer,
                size: finalBuffer.length,
                filename: fileName,
                mimetype: mimeType
            };

            console.log('File [' + fieldName + '] Finished');
        });
    });

    req.busboy.on('field', function (key, value, keyTruncated, valueTruncated) {
        console.log(key, '=', value);
        req.body[key] = value;
    });

    req.busboy.on('finish', function () {
        console.log('busboy finish');
        next();
    });

    return req.pipe(req.busboy);
}


function composeUrl(host, port, path) {
    return 'http://' + host + ':' + port + path;
}

router
    .get('/interview/:path', function(req, res, next){
        var video_path = decodeURIComponent(req.params.path);

        if (video_path.endsWith('.mp4') && fs.existsSync(video_path) && fs.statSync(video_path).isFile()) {
            //exists 流传输给前端,前端直接访问route即可
            res.set({
                "Content-type":"application/octet-stream",
                "Content-Disposition":"attachment;filename="+ 'bplus.mp4'
            });
            var fReadStream = fs.createReadStream(video_path);
            fReadStream.on("data",(chunk) => res.write(chunk,"binary"));
            fReadStream.on("end",function () {
                res.end();
            });
        }else{
            res.send({
                msg: 'not found :' + video_path
            })
        }

    })
    .post('/video/upload', handleFiles, function(req, res, next){
        var interview = JSON.parse(req.body.interview);

        var base = config.ugcVideoFolder;

        if (!base) {
            base = os.tmpdir();
        }

        //save video
        var tmp_path1 = path.join(base, path.basename(req.body.timeFileName + '.mp4'));
        fs.writeFileSync(tmp_path1, req.files['videoData'].buffer);

        //save audio
        var tmp_path2 = path.join(base, path.basename(req.body.timeFileName + '.wav'));
        fs.writeFileSync(tmp_path2, req.files['audioData'].buffer);

        //POST 传给后台,body的数据格式
        var interviewData = {
            interview_name: interview.interview_name,
            member_id: res.locals.hcd_user.member_id || 'c7b6d3fb-32ea-4606-8358-3b7c70fb1dea',
            interview_time: new Date(),
            file_name: req.body.userFileName,
            questions: [
                {
                    question_num: 1,
                    question_description: "自我介绍",
                    video_path: tmp_path1,
                    video_name: req.body.timeFileName + '.mp4',
                    audio_path: tmp_path2,
                    audio_name: req.body.timeFileName + '.wav',
                    video_length: interview.questions[0].upload_time
                }
            ]
        };

        //调用interview-service 保存数据 请求第三方server
        request({
            url: composeUrl(interviewInner.host, interviewInner.port, '/interview-info/upload'),
            method: "POST",
            json: false,
            headers: {
                "content-type": "application/json"
            },
            body: JSON.stringify(interviewData)
        }, function (err, data) {
            if(err){
                res.send({
                    msg: 'server error'
                });
            }else{
                res.send(data);
            }

        });

    })
;

module.exports = router;

记录工作中学习的一些新东西,截取项目中部分核心代码。

Nodejs是一种非常流行的JavaScript运行时环境,它允许JavaScript代码在服务器端运行。在Nodejs中,我们可以使用fs模块来读取和操作文件,包括JSON文件。 要读取JSON文件,我们可以使用fs模块的readFile方法。首先,我们需要将JSON文件的路径作为参数传递给该方法。然后,我们需要指定一个回调函数,该函数将接收两个参数:错误对象和文件内容。如果读取文件时出现错误,错误对象将不是null,否则文件内容将被传递给回调函数。 一旦我们读取了JSON文件,我们可以将其解析为JavaScript对象。为此,我们可以使用JSON对象的parse方法。该方法需要接收一个JSON字符串作为参数,并返回一个JavaScript对象。 以下是一个简单的Nodejs程序,演示了如何读取和解析JSON文件: ```javascript const fs = require('fs'); fs.readFile('data.json', 'utf8', (err, data) => { if (err) throw err; const jsonData = JSON.parse(data); console.log(jsonData); }); ``` 上述代码中,我们首先使用require语句引入了fs模块。接下来,我们使用fs.readFile方法读取名为data.json的JSON文件。'utf8'参数指定了我们希望读取文本文件,并将文件内容作为字符串返回。 读取文件后,我们使用JSON.parse方法将文件内容解析为JSON对象,并将其打印到控制台。注意,在实际开发中,我们可能需要根据具体应用场景对该代码进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值