掉光头发的node.js 文件上传_下载

522 阅读3分钟

前言:本文章内容仅作为自己的学习小计,内容仅供参考,如有侵权请联系

三线小城市前端攻城狮一枚,接触node时间不长,只会简单的用node写写接口.

开始

最近在给家里人做一个小程序,并没有盈利,只能自己写写接口实现业务功能,所以选择了对前端来说比较好上手的node最为后端语言,关于node服务启动可以去网上搜索一下教程.

关于上传是希望能跟java接口一样 上传到接口之后返回一个ip+端口号+文件名的地址回来,但是网上的教程大部分止步于将文件上传至服务器

代码分为两个部分 接口服务+文件服务 接口服务实现文件写入本地 文件服务实现外部客户端可通过地址进行访问

代码

1.接口服务代码

    var fs = require('fs');//加载fs模块
    app.post('/api/upload', function (req, res) {
      fs.readFile(req.files[0].path, function (err, data) {
        if (err) {
          console.log('Error');
        } else {
          let name = new Date() * 1 + req.files[0].originalname;//创建文件名 加入时间戳防止重名
          var dir_file = __dirname + '/dist/' + name; //staticPath拼接后的目录地址,为了跳到自己项目所在那个目录。
          fs.writeFile(dir_file, data,function (err) { //将文件写入同目录下的dist文件夹下
            let url = `http://xx.xx.xx.xx:8080/${name}` // 构建文件相对文件服务器地址xx代表你的服务器地址 8080为文件服务启动端口
            let ob = {
              ...result,
              url: url,
            }//成功提示 result是自己定义的成功提示对象
            res.status(200);//返回值
            res.send(ob);//返回内容
          })
        }
      })
    })

2.文件服务器端代码

    var http = require('http');
    var fs = require('fs');
    var url = require('url');
    var path = require('path')
    var server = http.createServer(function (req, res) {
      //1.__dirname是全局变量,可以直接获取。表示当前执行脚本所在的目录。(这里是E:\subject)
      var staticPath = path.join(__dirname, 'dist');
      //path.join方法,拼接目录地址
      //2.staticPath拼接后的目录地址,为了跳到自己项目所在那个目录。(这里是E:\subject\act)
      //3.req.url请求的链接(这里输出的是/index.html)
      var pathObj = url.parse(req.url, true);
      //url.parse方法,解析请求的url,解决链接"\"和"/"的差异问题。
      //4.解析后的req.url是个对象。
      //5.从解析后的对象中获取到pathname(这里pathObj.pathname是/index.html)
      var filePath = path.join(staticPath, pathObj.pathname);
      //path.join方法,拼接完整项目目录地址。
      //6.fileContent拼接后的项目目录名字(这里是E:\subject\act\index.html)
      try {
        //fs.readFileSync方法,同步读取文件信息										  
        var fileContent = fs.readFileSync(filePath, 'binary');
        //读取拼接完整后的目录中的文件, 'binary'表示二进制方式读取	
        res.write(fileContent, 'binary');
      } catch (error) {
      
      }
      res.end();
    });
    server.listen(8080);//文件服务启动端口 注意不要与其他端口重复
    console.log('服务器已打开, 可以运行 http://localhost:8080');

接口端文件跟服务器端文件分别用node指令执行即可 最后返回效果:

image.png

后记

相对于java,node可能在一些人眼里看起来比较幼稚,就跟总有人喜欢拿vue跟react作比较一样,在这里引用尤雨溪大佬的一句话 就算你证明了 A 比 B 牛逼,也不意味着你或者你的项目就牛逼了... 比起争这个,不如多想想怎么让自己变得更牛逼吧。