友情提示:这篇博客不会详细说明搭建过程

阅读群体建议:第一次使用node或者koa2写文件上传或者下载,因为你不知道用fs的哪个方法,我也是从fs里试水试了一天,各种百度才搞出来的,特别学过java的来看更容易理解!希望可以帮助跟我一样自学的朋友!

错误思路:我最开始想把文件上传到mysql中,字段换成blob就好了,但是我也不知道存没存进去,查出来是二进制也不会转换,搞死了,想着没有Tomcat服务器,怎么存储文件啊,后来发现,我们的项目本身就可以当做服务器,直接把文件存储到src下边就好了呀,没有必要非得存到Tomcat或者mysql里啦,这个错误思路,影响了我大半天,赶紧扭转思路,放下看吧!!!

思路:

保存:

  第一步:页面想后台传送文件流

  第二步:使用koa-router配合koa-body进行接收

  第三步:读取文件流let readStream = fs.createReadStream(file.path) 返回一个reader二进制文件 file为接收前台的文件

  第四步:将文件流写入本地,let writeStream = fs.createWriteStream(filePath)

      注意:本机路径地址,我放到了koa2工程的/src/uploads/images/里边  所以引入const path = require("path") ,let filePath = path.resolve('src/uploads/images/'),会返回一个绝对路径,把这个绝对路径放到写入流的参数里

  第五步:readStream.pipe(writerStream) 这个必须要有,至于为什么,我目前还不清楚

  第六步:将这个filePaht绝对路径的地址保存到数据中,为了以后查询使用

查询:

  第一步:从数据库中查询到文件的绝对路径 path

  第二步:查询该文件的流!使用let readStream = fs.readFileSync(path), 注意:这个方法是同步的,所以没有回调函数,只能定义一个变量接受返回值!最好不要用fs.readFile()这个方法,这个方法是异步的,会很麻烦

  第三步:如果是图片,将该文件转换成base64,let base64 = readStream.toString('base64')

      简写(第二步也可以简写成 let base64 = fs.readFileSync(path,'base64')

  第四步:转换成你想要的base64格式 比如:let base64 = "data:image/png;base64,"  + fs.readFileSync(path,'base64');

  第五步:ctx.body = base64; 就可以返回给前台了

完毕  !!!!以上为简单的啰嗦的逻辑   !!!!

下边为代码,按照java的习惯,先从dao层开始写起来!!!!!!!

第一步:mysql的配置,这个config.js我就不列出来,就算不列出来,想必你也懂得!

  1. import {
  2. DB
  3. } from '../config.js'
  4.  
  5. async function mysql(opt1, opt2) {
  6.  
  7. let mysql = require('mysql2/promise');
  8.  
  9. let connection = await mysql.createConnection({
  10. host: DB.HOST,
  11. user: DB.USER,
  12. password: DB.PASSWORD,
  13. database: DB.DATABASE,
  14. port: DB.PROT
  15. });
  16.  
  17. let [result, fields] = await connection.execute(opt1, opt2);
  18.  
  19. await connection.end();
  20.  
  21. return result
  22. }
  23.  
  24. module.exports = mysql

第二步:dao层,新增文件

  1. import {
  2. util,
  3. mysql,
  4. getsql,
  5. } from '../tool';
  6.  
  7. class loginUser {
  8. // 新增图片
  9. async addPhoto(filePath){
  10. console.log('进入了dao层');
  11. let sql = 'insert into image (`image`) values ("'+ filePath + '+")';
  12. return await mysql(sql);
  13. }
  14. }
  15. module.exports = new loginUser();

第三步:服务层,逻辑的处理,进行保存图片,导入第二不的dao层文件demo.js,这里服务层返回数据的格式不标准,不建议工作用,学习可以!

  1. import loginUser from '../../dao/demo.js';
  2. const fs = require('fs');
  3. const path = require('path');
  4. class login {
  5. }
  6. /**
  7. * 新增图片的方法
  8. *
  9. * @param {any} ctx
  10. * @memberof login
  11. */
  12. async addPhoto(ctx) {
  13. console.log('进入了服务层');
  14. let file = ctx.request.body.files.file;
  15. let filePath = path.join(path.resolve('src/uploads/images'), file.name);
  16. const reader = fs.createReadStream(file.path);
  17. const writer = fs.createWriteStream(filePath);
  18. reader.pipe(writer);
  19. let result;
  20. try {
  21. await loginUser.addPhoto(filePath).then(res => {
  22. console.log(res);
  23. result = res;
  24. })
  25. ctx.body = result;
  26. } catch (error) {
  27. console.log(error);
  28. }
  29. }
  30. }
  31.  
  32. module.exports = new login();

第四步:控制层,也叫路由层 ,调用了服务层demo.js中的addPhoto方法,这个里边啥都不用写,只需要对外暴露即可!

  1. import KoaRouter from 'koa-router'
  2. import service from '../service'
  3. const router = new KoaRouter({
  4. prefix: '/loginuser'
  5. })
  6. router.post('/addPhoto',demo.addPhoto);

第五步:前段页面使用element-ui,把action写成路由对外暴露的路径即可,这里为loginuser/addPhoto

  1. <el-upload
  2. action="loginuser/addPhoto"
  3. list-type="picture-card"
  4. :on-preview="handlePictureCardPreview"
  5. :on-remove="handleRemove"
  6. :multiple="false">
  7. <i class="el-icon-plus"></i>
  8. </el-upload>

以上为保存的逻辑!写的已经很详细了!!!

下边是查询的,我就只列出服务层的代码,逻辑部分,否则有凑字数嫌疑,最重要的就是使用fs.readFileSync这个方法,还有如何拼凑base64,就这俩难点!

  1. // 查询图片服务
  2. async findImg(ctx) {
  3. console.log('进入图片查询服务层');
  4. let result = [];
  5. try {
  6. await loginUser.findImg().then(res => {
  7. let index = 0;
  8. for (let val of res) {
  9. let read = fs.readFileSync(val.image,"base64");
  10. let data = "data:image/jpeg;base64,"+read;
  11. result.push(data);
  12. index++;
  13. }
  14. })
  15. console.log('开始执行ctx.body');
  16. console.log(result);
  17. ctx.body = result;
  18. } catch (error) {
  19.  
  20. }
  21. }

我把数据库的字段也列一下吧

没错,就一个字段,还是varchar类型我给了256个长度!

最后:谢谢查看!!!!!!!

连接:

koa2接受文件:http://www.ruanyifeng.com/blog/2017/08/koa.html

base64拼接:https://www.cnblogs.com/x-st/p/5220282.html

koa2官网demo:https://github.com/ruanyf/koa-demos/blob/master/demos/21.js

欢迎一起探讨node的学习曲线,如何搭建好的koa2框架! 邮箱:zhou8337626@163.com

element-vue-koa2-mysql实现文件上传的更多相关文章

  1. php操作mysql关于文件上传、存储

    php+前端+mysql实现文件上传并储存 我们都知道很多网站都需要上传文件,最普遍的就是图片上传,即是用户头像等等: 关于mysql+php实现文件查询,存储大致两个方式, 1.直接把文件写入mys ...

  2. vue使用formData进行文件上传

    本文为博主原创,未经允许不得转载 1.vue页面 <ux-form ref="formRef" layout="vertical"> <ux- ...

  3. vue+element-ui, el-upload组件 文件上传之前return false,会自动调用文件移除回调问题

    日常搬砖的时候,项目中在使用element-ui的上传组件,但是当我在文件上传文件之前的回调里面做了些文件格式的二次校验和文件大小的校验的时 然后 return false 会发现调用 文件移除的回调 ...

  4. vue 使用element-ui upload文件上传之后怎么清空

    首先上传组件中一定要绑定这两个属性: ref,和 :file-list,如果没有ref,即使 用 this.$refs.upload.clearFiles()也不行,因为这时候this.$refs为空 ...

  5. nginx -stream(tcp连接)反向代理配置 实现代理mysql以及文件上传

    原文链接:https://blog.csdn.net/Activity_Time/article/details/95767390 1. stream模块安装 nginx默认安装的时候无法加载流str ...

  6. vue+element UI + axios封装文件上传及进度条组件

    1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...

  7. vue + element 文件上传 并将文件转 base64

    当时有一个需求 是需要用到上传文件这个功能,并且需要将文件转为 base64 给到后台.网上找的全是啥图片转base64 肯定是因为这类需求比较常见.当时有点懵了.后面一想,都他娘是文件啊.然后就找到 ...

  8. springboot+vue实现文件上传

    https://blog.csdn.net/mqingo/article/details/84869841 技术: 后端:springboot 前端框架:vue 数据库:mysql pom.xml: ...

  9. element中文件上传

    vue+element 文件操作 作者:一粒尘土 时间:2019-3-17 注:以下操作针对 vue-cli 目录 使用 组件常用参数 组件常用方法 上传文件 上传文件格式限制 回显文件 下载文件 删 ...

  10. VUE项目中文件上传兼容IE9

    项目使用VUE编写,UI是ElementUI,但是Element的Upload组件是不兼容IE9的.因为IE9中无法使用FormData. 查找资料基本有两种解决方法:1.引入JQuery和jQuer ...

随机推荐

  1. 201621123075 Week02-Java基本语法与类库

    1.本周学习总结 本周学习了java的数据类型,有基本数据类型和引用数据类型(不同c),特有的boolean类型,取值只有true和false.还有包装类和数组,每一个基本类型都有相对应的包装类,对应 ...

  2. vuex-Action(异步)

    Action 类似于 mutation,不同在于: Action 提交的是 mutation,而不是直接变更状态. Action 可以包含任意异步操作. const store = new Vuex. ...

  3. Beta 冲刺 (3/7)

    Beta 冲刺 (3/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 参与开发关键词提醒部分 展示GitHu ...

  4. ssl证书安装到iis服务器

    1.先购买ssl证书, 2.对付会先发一份邮件到你的邮箱,进行验证 3.再查看邮箱,会发现有了对应的证书文件. 附件会有一个压缩包,里面包含4份证书文件, 还有一个通配符的字符串. 4.下载之后, 先 ...

  5. python笔记16-函数

    函数说白了,就是把一组代码合到一起,可以实现某种功能,需要再用到这个功能的话,直接调用这个函数就行了 1.定义函数def def my_open():#函数名,def定义函数,my_open给这个函数 ...

  6. JAVA循环结构

    JAVA循环结构:顺序结构只能执行一次,如果要执行多次需要用到循环 JAVA中的循环结构有while:do...while:for: 1.while循环:先判断布尔表达式中的值,若为true,执行循环 ...

  7. python中如何删除列表中的所有元素

    今天写代码的时候遇到一个小问题,Python中要删除列表中的所有元素.Python本身就提供了pop.remove.del这些删除的函数.我想着用循环实现,结果很麻烦.几番周折上了stackoverf ...

  8. Jmeter的察看结果树 出现乱码的解决方法

    在apache-jmeter-3.0\bin目录下, 用Notepad工具打开jmeter.properties文件 在文件中搜索encoding,可以搜素到1030行: #sampleresult. ...

  9. HTML5:定位

    定位 一.介绍: position设置块级元素相对于其父块的位置和相对于它自身应该在的位置,任何使用定位的元素都会成为块级元素. 1.属性值 属性值 描述 absolute 生成绝对定位的元素,相对于 ...

  10. nodejs -- event 模块, 事件模块.

    1. 注册事件 on 或者 addListener,触发事件 emit 1-1简单的使用: var EventEmitter = require('events').EventEmitter; var ...