node上传文件

管理后台

需求:项目结构 node模板渲染 + node中转服务器 + java后端 

中间需要前端上传文件到node中转服务 node中转服务再传文件到java后端

1. 前端上传文件到node服务

// multer 读取formdata上传的文件

var multer = require("multer"); // 下载模块 npm i multer -s 

var upload = multer({dest:'./public/uploads'});  // 文件存储位置

router.post('/uc/v1/file/upload', upload.single('file'),function( req,res ){
    var file_type;
    if (req.file.mimetype.split('/')[0] == 'image'){
         file_type = '.' + req.file.mimetype.split('/')[1];
    }
    if (file_type) {
        fs.rename(req.file.path, req.file.path + file_type, function (err, doc) {
            if (err) {
                console.error(err);
                return;
            }
            httpA.postFile( req,res ,'./public/uploads/' + req.file.filename + file_type,req.file.filename + file_type );
        })
        return;
    } else{
        res.json({ code:"1",message:"上传失败" })
    }   
})

2. node服务传文件到后端 

let httpA = {

     /**
     * 
     * @param {*} req  request 对象
     * @param {*} res  responese  对象
     * @param {*} filepath  文件路径
     * @param {*} filename  文件名称  name+扩展名
     */
    postFile( req , res , filepath , filename ){  
        var options = {  
            hostname:config.adminHost,
            port: config.adminPort,
            path: req._parsedUrl.path,
            method: 'POST'
        }
        //  模仿 浏览器传文件  
        var boundaryKey = '----' + req.headers['content-type'].split('----')[1];  //生成分隔数据
        fs.readFile( filepath , function (err, data) {  //读取需要上传的文件内容
            if( err ){
                res.json( { code:1, message : "node读取文件错误",error:err });
            }else{
                //拼装分隔数据段
                var payload = '--' + boundaryKey + '\r\n' + 'Content-Disposition:form-data; name="file"; filename="'+filename+'"\r\n' + 'Content-Type:text/plain\r\n\r\n';
                payload += data;
                payload += '\r\n--' + boundaryKey + '--';
                //发送请求
                var reqA = http.request(options, function (response) {
                    response.setEncoding('utf8');
                    response.on('data', function (chunk) {
                        res.json( JSON.parse( chunk ) );
                    });
                    fs.unlink(filepath, function( err ){   //  上传文件之后  删除文件 
                        // if(err){
                        //      throw err;
                        // }
                    })
                });
                
                reqA.on('error', function(e) {
                    console.error("error:"+e);
                });
                //把boundary、要发送的数据大小以及数据本身写进请求
                reqA.setHeader('Content-Type', req.headers['content-type']);
                reqA.setHeader('Connection', 'keep-alive');
                reqA.setHeader('Content-Length', Buffer.byteLength(payload, 'utf8'));
                reqA.setHeader('Authorization', localStorage.getItem("user"+ req.headers.authorization ));
                reqA.write(payload);

                reqA.end();
            }
        });  
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值