文件上传

文件上传

服务器路由:

// ./routes/students.js
const express = require('express');
const router = express.Router();
const multer = require('multer');
const path = require("path")
const fs = require("fs");
const { rootPath } = require("../utils/baseInfo")
const upload = multer({ dest: path.join(rootPath, "/public/images/headPic") });//** 


// 文件上传接口
router.post('/upload', upload.single('file'), async function (req, res, next) {//** 
  //其中'file'是文件上传的key
  const originalname = req.file.path;
  const newname = originalname + path.extname(req.file.originalname);

  fs.rename(originalname, newname, error => {
    if (error) throw error;
    const responsename = newname.replace(rootPath + `${path.sep}public${path.sep}`, "");//
    res.send(responsename);
  })
});
// 文件删除接口
router.post('/deletePic', async function (req, res, next) {//** 
  const { file } = req.body;
  fs.unlink(path.join(rootPath, "public", file), function (err) {
    if (err) res.send(false);
    else res.send(true);
  })
});

module.exports = router;

服务器工具模块,用来保存项目根目录

//. ./util/baseInfo.js
const path = require("path");
const os = require("os")
// os.type()
// 在 Linux 上返回 'Linux',在 macOS 上返回 'Darwin',在 Windows 上返回 'Windows_NT'。
module.exports = {
    rootPath:path.join(/window/i.test(os.type())?"":"/",path.resolve(__dirname,"../"))//项目根路径
}

客户端文件本地显示代码:

function getFileURL(file) {//该方法用来获取文件在浏览器中的缓存地址,实现本地显示
    var getUrl = null;
    if (window.createObjectURL != undefined) { // basic
        getUrl = window.createObjectURL(file);
    } else if (window.URL != undefined) { // mozilla(firefox)
        getUrl = window.URL.createObjectURL(file);
    } else if (window.webkitURL != undefined) { // webkit or chrome
        getUrl = window.webkitURL.createObjectURL(file);
    }
    return getUrl;
}
//   ./views/students/update.js-->handler
//监听文件上传的input事件,用于本地显示图片
$(document).on("input", ".update-head-pic-file", function () {
  const file = this.files[0];
  if (file) $(this).nextAll("img").attr("src", getFileURL(file));
});

客户端文件上传ajax原生实现:

function upload(url,keyName,file) {
  //url:上传的服务器接口。
  //keyName:上传的文件的key。
  //file:上传的文件(由input[type='file']获取)
  return new Promise(r => {
    const fd = new FormData();
    fd.append(keyName, file);//键的名字必须与服务器对应
    $.ajax({
      url:"xxxxxx",
      type: "post",//*** 
      data: fd,//*** 
      cache: false,//上传文件无需缓存
      contentType: false,//*** //数据的解析类型,不需要,我们上传2进制数据,没有类型
      processData: false,//*** //用于对data参数进行序列化处理 这里必须false
      success(data) {
        r(data)
      }
    })
  })
}

layui实现:

var uploadInst = upload.render({
  elem: '#test1' //绑定元素
  , url: '/students/upload/' //上传接口
  ,auto:false//自动上传,选择完图片立即上传
  ,field:"file"//文件上传的key,默认:“file”
  ,bindAction:"#sure"//非自动上传时,图片上传触发的按钮
  , headers: { "Authorization": `Bearer ${localStorage.user_token}` }//jwt验证需要的请求头
  , done: function (res) {
    //上传完毕回调
  }
  , error: function () {
    //请求异常回调
  }
  , choose(obj){
    //将每次选择的文件追加到文件队列
    var files = obj.pushFile();
    //预读本地文件,如果是多文件,则会遍历。(不支持ie8/9)
    obj.preview(function(index, file, result){
      //==========该函数中可以实现图片预览
      //通过getFileURL(file)	获取缓存地址,即可用于img标签显示
      
      console.log(index); //得到文件索引
      console.log(file); //得到文件对象
      console.log(result); //得到文件base64编码,比如图片
      //obj.resetFile(index, file, '123.jpg'); //重命名文件名,layui 2.3.0 开始新增
      //这里还可以做一些 append 文件列表 DOM 的操作
      //obj.upload(index, file); //对上传失败的单个文件重新上传,一般在某个事件中使用
      //delete files[index]; //删除列表中对应的文件,一般在某个事件中使用
    });
  }
});

具体代码(这里是原生实现,我们最好改为腊鱼你实现):

//   ./views/students/update.js
//添加
$("#tab-wrap-add").on("click", ".addBtn", async function () {
  const $fileInput = $(".addStudentForm [type='file']");
  const file = $fileInput[0].files[0];
  if (file) {//file存在即上传
    const headPic = await that.upload("/students/upload", "headPic", file);
    $fileInput.prev().val(headPic);
  }
  const { status } = await that.add({ stu: layui.form.val("addStudent") })
  if (status) {
    layui.layer.msg("添加成功!");
  } else {
    layui.layer.msg("添加失败!");
  }

})
//   ./views/students/add.js
//更新
$("#tab-wrap-update").on("click", ".updateBtn", async function () {
  const id = $(".updateStudentForm")[0].id.value;
  const $fileInput = $(".updateStudentForm [type='file']");
  const file = $fileInput[0].files[0];

  //删除-start
  const oldHeadPic = $(".updateStudentForm")[0].headPic.value;
  if (oldHeadPic && file) {
    await that.deletePic("/students/deletePic",oldHeadPic)
  }
  //删除-end

  //文件上传-start
  if (file) {//file存在即上传
    const headPic = await that.upload("/students/upload", "headPic", file);
    $fileInput.prev().val(headPic);
  }
  //文件上传-end

  //上传成功后更新学生信息
  const data = await that.update({ stu: $(".updateStudentForm").serialize(), id })
  if (data.status) {
    layui.layer.msg("修改成功!");
    location.hash = "/info/list/学生信息";
  } else {
    layui.layer.msg("修改失败!");
  }
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值