资讯专栏INFORMATION COLUMN

node之本地服务器图片上传

LoftySoul / 3246人阅读

摘要:在自己做一个简单的后台管理系统时,用的是作本地数据库,然后用了的组件来实现图片的上传,中间有遇到那么点小坑,这里记录下,比较坑的一点就是,不知道文件的命名不能带空格,然后改了好久文件这里的话,就是简单点的使用图形界面框架的上传组件,然后

在自己做一个简单的后台管理系统时,用的是node作本地数据库,然后用了Element-ui的upload组件来实现图片的上传,中间有遇到那么点小坑,这里记录下,比较坑的一点就是,不知道文件的命名不能带空格,然后改了好久
1.index.vue文件

这里的话,就是简单点的使用图形界面框架Element-ui的上传组件,然后,action就是服务器端的地址,我这里使用了代理,将localhost:8080代理到你使用node作为服务器的地址就可以了


2.代理文件

我这里使用的是vue-cli3脚手架来搭建的项目,所以,自己在项目的根目录下创建一个vue.config.js来做一些配置

module.exports = {
  devServer: {
    port: 8080,
    headers: {
    },
    inline: true,
    overlay: true,
    stats: "errors-only",
    proxy: {
      "/api": {
        target: "http://127.0.0.1:3000",
        changeOrigin: true // 是否跨域
      }
    }
  },
};
3.node服务器端文件
这里很重要的一点就是设置静态资源目录
app.use("/serverImage", express.static(path.join(__dirname, "serverImage")));

对图片上传进行了方法的封装

const fs = require("fs");
const path = require("path");
/* formidable用于解析表单数据,特别是文件上传 */
const formidable = require("formidable");
/* 用于时间格式化 */
const formatTime = require("silly-datetime");

/* 图片上传 */
module.exports = (req, res) => {
  /* 创建上传表单 */
  let form = new formidable.IncomingForm();
  /* 设置编码格式 */
  form.encoding = "utf-8";
  /* 设置上传目录(这个目录必须先创建好) */
  form.uploadDir = path.join(__dirname, "../serverImage");
  /* 保留文件后缀名 */
  form.keepExtensions = true;
  /* 设置文件大小 */
  form.maxFieldsSize = 2 * 1024 *1024;

  /* 格式化form数据 */
  form.parse(req, (err, fields, files) => {
    let file = files.file;
    /* 如果出错,则拦截 */
    if(err) {
      return res.send({"status": 500, msg: "服务器内部错误", result: ""});
    }

    if(file.size > form.maxFieldsSize) {
      fs.unlink(file.path);
      return res.send({"status": -1, "msg": "图片不能超过2M", result: ""});
    }

    /* 存储后缀名 */
    let extName = "";

    switch (file.type) {
      case "image/png":
        extName = "png";
        break;
      case "image/x-png":
        extName = "png";
        break;
      case "image/jpg":
        extName = "jpg";
        break;
      case "image/jpeg":
        extName = "jpg";
        break;
    }
    if(extName.length == 0) {
      return res.send({"status": -1, "msg": "只支持jpg和png格式图片", result: ""});
    }

    /* 拼接新的文件名 */
    let time = formatTime.format(new Date(), "YYYYMMDDHHmmss");
    let num = Math.floor(Math.random() * 8999 + 10000);
    let imageName = `${time}_${num}.${extName}`;
    let newPath = form.uploadDir + "/" + imageName;

    /* 更改名字和路径 */
    fs.rename(file.path, newPath, (err) => {
      if(err) {
        return res.send({"status": -1, "msg": "图片上传失败", result: ""});
      } else {
        return res.send({"status": 200, "msg": "图片上传成功", result: {url: `http://localhost:3000/serverImage/${imageName}`}});
      }
    })
  })
};

方法的调用

const express = require("express");
const router = express.Router();
const uploadImg = require("./uploadImg");

/* 上传图片 */
router.post("/upload", (req, res) => {
  uploadImg(req, res);
});

module.exports = router;

服务器端入口文件

const express = require("express");
const app = express();
const path = require("path");
/* body-parser是一个HTTP请求体解析的中间件
 * 使用这个模块可以解析JSON、Raw、文本、URL-encoded格式的请求体
 * */
const bodyParser = require("body-parser");

const dataBaseOperate = require("./database/operate");

/* 以application/json格式解析数据 */
app.use(bodyParser.json());
/* 以application/x-www-form-urlencoded格式解析数据 */
app.use(bodyParser.urlencoded({ extended: false }));

/* 设置静态资源目录 */
app.use("/serverImage", express.static(path.join(__dirname, "serverImage")));

app.use("/api", dataBaseOperate);


app.listen(3000, () => {
  console.log("server is listening to http://localhost:3000")
});
4.小结下

对于接口文件的返回,这里使用了body-parser这个中间件来对node返回的body进行json格式的解析

很重要的一点就是设置静态资源目录,不然的话就会报错,找不到文件或者文件夹

设置静态资源目录,用于存储服务器端的静态资源文件
app.use("/serverImage", express.static(path.join(__dirname, "serverImage")));

然后就是对文件的命名不能出现空格

文件的链接可以使用本地服务器端的url地址

正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯^_^)

往期好文推荐:

判断ios和Android及PC端

webpack打包(有面试题)

纯css实现瀑布流(multi-column多列及flex布局)

实现单行及多行文字超出后加省略号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102982.html

相关文章

  • Express系列multer

    摘要:目前觉得对我有用的是和。后者可以在本地调试页面,对于手机页面尤其有用。这次主要说一下,我并没有实现所有的功能,只是实现单图片上传这一个功能,其他的再摸索喽。目前就这样,下次弄出来了多图片上传我再接着更新。 这两天在看《nodejs权威指南》,这本书看了好久了,但是读的一直不细,这次才好好看了一遍。 收获还是蛮多的,主要在于wenpack使用的一些细节问题,有点茅塞顿悟的体验吧,另外在n...

    Null 评论0 收藏0
  • php图片处理本地图片转base64格式上传

    摘要:文章首发于蓝锅锅博客主要是用到的接口,既然是的,所支持的浏览器我就不多说啦,老生常谈的问题了,远离,珍惜生命。目录路径为目录路径为文章首发于蓝锅锅博客,欢迎交流,共同进步。 我们在开发系统时,处理图片上传是不可避免的,例如使用thinkphp的肯定很熟悉import(@.ORG.UploadFile);的上传方式,今天我们来讲一个使用html5 base64上传图片的方法。文章首发于蓝...

    levy9527 评论0 收藏0
  • php图片处理本地图片转base64格式上传

    摘要:文章首发于蓝锅锅博客主要是用到的接口,既然是的,所支持的浏览器我就不多说啦,老生常谈的问题了,远离,珍惜生命。目录路径为目录路径为文章首发于蓝锅锅博客,欢迎交流,共同进步。 我们在开发系统时,处理图片上传是不可避免的,例如使用thinkphp的肯定很熟悉import(@.ORG.UploadFile);的上传方式,今天我们来讲一个使用html5 base64上传图片的方法。文章首发于蓝...

    isaced 评论0 收藏0
  • 基于node开发的多用户博客系统

    摘要:多用户博客系统该多用户博客系统,是在之前一开始学习的使用的时候,大佬说让去做一个系统性的项目,这样前后端兼顾,从里面去系统性的总结东西,索性就做了一个这个,项目的架子是根据一个开源项目的指导进行入坑的,陆陆续续用了四个月时间,由于是刚步入大 多用户博客系统 该多用户博客系统,是在之前一开始学习node的使用的时候,大佬说让去做一个系统性的项目,这样前后端兼顾,从里面去系统性的总结东西...

    Olivia 评论0 收藏0

发表评论

0条评论

LoftySoul

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<