node如何实现图片/文件上传下载

node如何实现图片/文件上传下载

io.js

const fs = require('fs')
const io = {
     ExitsFile : async function(path){
        //判断文件是否存在
         await fs.exists(path, function(exists) {
            if(exists){
                return 1
            }else{
                //创建目录
                fs.mkdir(path,(err)=>{
                    if(err){
                        throw err;
                    }
                    return 2
                })
            }
        });
    },
    ReadFile :function(){

    },
    WriteFile :function(data){
        var writeStream = fs.createWriteStream(data)
        writeStream.write(str)
         //监听写入完成
         writeStream.on('finish',()=>{
            console.log('写入完成')
        })
    }

}
module.exports = io;

上传配置 multer

const io = require("../utils/io");
const multer = require("multer");
const path = require("path");
const uuid = require('uuid')

let uploadUtils = {
  multer() {
    //保存规则
    var storage = multer.diskStorage({
      //目录
      destination: function (req, res, cb) {
        const length = req.files.length - 1
         io.ExitsFile('/root/upload/'+req.files[length].fieldname);
        cb(null, '/root/upload/'+req.files[length].fieldname);
      },
      //文件名
      filename: function (req, file, cb) {
        let extname = path.extname(file.originalname);
        let fileid = uuid.v4()
        global.fileid = fileid
        cb(null, fileid + extname);
      },
    });
    //设置过滤规则(可选)
    // var imageFilter = function (req, file, cb) {
    //   var acceptableMime = [
    //     "image/jpeg",
    //     "image/png",
    //     "image/jpg",
    //     "image/gif",
    //   ];
    //   //微信公众号只接收上述四种类型的图片
    //   if (acceptableMime.indexOf(file.mimetype) !== -1) {
    //     cb(null, true);
    //   } else {
    //     cb(null, false);
    //   }
    // };
    //设置限制(可选)
    // var imageLimit = {
    //   fieldSize: "2MB",
    // };
    //配置上传文件的中间件
    var upload = multer({
      storage: storage,
      // fileFilter: imageFilter,
      // limits: imageLimit,
    });
    return upload;
  },
};
module.exports = uploadUtils;

使用multer

const uploadUtils = require("../utils/multer");
router.post("/uploadnote", uploadUtils.multer().any(), (req, res) => {
  var uid = mongoose.Types.ObjectId(global.token);
  //保存到本地
  //存储到数据库
  let obj = {
    uid: uid,
    imgid: req.files[0].filename,
    imgname: req.files[0].originalname,
    fileid: req.files[1].filename,
    filename: req.files[1].originalname,
    description: req.body.description,
  };
  const arr = new NoteModel(obj);
  arr.save(function (err, docs) {
    if (err) {
      return res.send(err._message);
    }
    return res.send(docs);
  });
});

pipe读取文件

app.get('/image/:imgid',(req,res)=>{

  let imgid = req.params.imgid;
  console.log(imgid)
  const cr = fs.createReadStream(`/root/upload/img/${imgid}`,{
    // highWaterMark:3, //文件一次读多少字节,默认 64*1024
    flags:'r', //默认 'r'
    autoClose:true, //默认读取完毕后自动关闭
    // start:0, //读取文件开始位置
    // end:3, //流是闭合区间 包含start也含end
    // encoding:'utf8' //默认null
  })
  cr.on('error',(err)=>{
    res.send(err)
  })
  cr.pipe(res);
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上天注定的姻缘最大嘛!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值