vue3+koa实现文件上传功能的全过程记录

目录
  • 前言:
  • 技术引用:
  • 前端实现
  • 后台实现:
    • 引入koa-body,并注册中间件:
    • 引入koa-static 进行静态资源访问
  • 前台回显图片:
  • 遇到的问题:
    • 已解决:
      • Token验证问题:
      • proxy代理问题:
  • 总结:

前言:

在完成自己的毕设中,需要引入文件上传,前后找到资料实现了图片上传,在此做一个总结

技术引用:

1. 使用了 koa-body 实现后台文件上传功能

2. 使用了 koa-static 实现后台资源静态访问

3. 使用了 Element plus UI的upload组件实现前端文件上传

前端实现

代码实现:

     <el-upload
            v-model:file-list="fileList"
            class="upload-demo"
            action="/api/article/upload"
            :limit="1"
            :on-remove="handleRemove"
            :on-change="handlePreview"
            :on-success="handleSuccess"
            list-type="picture"
            :headers="{ Authorization: headers }"
            accept="image/jpeg,image/png"
          >
            <el-button type="primary">Click to upload</el-button>
            <template #tip>
              <div class="el-upload__tip">
                jpg/png files with a size less than 500kb
              </div>
            </template>
          </el-upload>

其中介绍几个重要的需要用到的属性:

 action="/api/article/upload" // 向该目录下发送接口
 :on-remove="handleRemove"   //删除图片触发的回调事件
 :on-change="handlePreview"  //触发图片新增之类的修改触发的回调事件
 :on-success="handleSuccess" //向action路径下发送接口请求的响应的回调函数
 :headers="{ Authorization: headers }" // 向请求头携带字段,因为我这里使用了Token,需要在请求前携带Authorization
 accept="image/jpeg,image/png"//接受的文件类型方便挑选。

handleSuccess 方法的第一哥参数response就是访问/api/article/upload后的响应结果,这个结果就是我们将图片放在静态资源目录的基本地址basePath,我这边 封装了一下, imgPath的结果如下: { imgBathPath:upload_4f60af0c9732ab4a1463e29c4bbc8c04.jpg, imgName:"xxxx"},拥有图片的地址和图片名字,用于查看时候的回显。

   const handleSuccess = (response) => {
      console.log(response.data, "--------");
      imgPath.value = response.data;
    };

后台实现:

引入koa-body,并注册中间件:

app.use(koabody({
  multipart: true, //开启文件上传
  formidable: { // 路径配置
    // 在配置选项option 不推荐使用相对路径
    uploadDir: path.join(__dirname, './upload'),  //配置保存路径
    keepExtensions: true //保存文件扩展名
  }
}))

在配置完koa-body 后,就可以通过 const { file } = ctx.request.files; 拿到本次文件上传的图片的一些信息。再进行后端检验,只接受图片类型文件的上传,不然返回失败:

router.post('/upload', async (ctx) => {

    // console.log(ctx.request.files, "ctx.request.files")
    const { file } = ctx.request.files;
    const fileTypes = ["image/jpeg", "image/png"]
    if (file) {
        if (fileTypes.includes(file.type)) {
            ctx.body = util.success({ imgName: file.name, imgBathPath: path.basename(file.path) }, "上传成功")
        } else {
            ctx.body = util.fail("上传图片非jpg 和 png 格式")
        }

    } else {
        ctx.body = util.fail('上传出错')
    }

    // ctx.body = util.success(ctx.request.files.file.path, "上传成功")
})

引入koa-static 进行静态资源访问

app.use(koaStatic(path.join(__dirname, './upload')))//开启静态资源访问

之后,./upload文件下就是静态资源了,我们可以直接访问,如:

前台回显图片:

首先我们接口返回的数据结果如下:

const mongoose = require('mongoose')
const articleSchema = mongoose.Schema({
    articleTitle: String,   // 文章标题
    articleType: String,   // 文章类型
    articleContent: String, // 内容,富文本
    publishState: Number,  // 发布状态 0 未发布 1 已发布 2已删除
    articleAuth: String,
    imgPath: {
        imgName: String,
        imgBathPath: String,
    },
    applyUser: {
        userId: String,
        userName: String,
        userEmail: String
    },
    publishTime: { type: Date, },
    createTime: { type: Date, default: Date.now } // 创建事件
})

module.exports = mongoose.model("article", articleSchema, "article")

我们在渲染列表的时候,就已经得到了所有信息,现在只需要点击查看回显信息而已

  const handleView = (row) => {
      action.value = "view"; // 设置action状态,用来判断disable条件
      let data = { ...row }; //遍历弹窗数据

      // 将文本编辑器设置为只读
      // const editor = editorRef.value;
      // editor.disable();

      // 填充富文本到富文本编辑器中
      articleContent.value = data.articleContent;

      // 处理图片的回显
      const temp = {
        name: data.imgPath.imgName,
        url: "http://localhost:3000/" + data.imgPath.imgBathPath,
      };

      fileList.value.push(temp);
      console.log(fileList.value, "fileList.value");
      articleForm.value = data;
      showModal.value = true;
    };

效果如下:

遇到的问题:

已解决:

Token验证问题:

因为我全局加入了接口校验,导致在最初的时候我upload 的结果一致倒是400,未加入Token,并且在访问的时候也是一致报Token问题,这是俩个问题。在上传时候,是需要Token,也就是通过:header属性添加Authorazation。但是访问的时候报错,是因为我们访问静态资源的时候也是接口访问,需要在后台加上这段代码:对一些不需要的token进行的接口拦截放过,例如/api下的login接口,和非api开头的所有接口,也就是我们访问静态资源的接口。

app.use(koajwt({ secret: 'secret' }).unless({
  // 过略一些不需要token的接口
  // 过略掉除了 登录接口 和 非api接口(主要为静态资源请求接口)
  path: [/^\/api\/users\/login/, /^((?!\/api).)*$/],

})) // 使用中间件进行token拦截

proxy代理问题:

在vue3 cli 的配置下,配置了proxy代理:这样访问以/api的接口都会跳转到/localhost:3000/api下。

    proxy: {
      //拦截以api开始的请求,将/api 替换成http://localhost:3000, 浏览器同源策略,无法在前端 port:8080 访问后端 prot:3000 端口,需要借助代理拦截请求,进行接口转发
      "/api": {
        target: "http://localhost:3000"
      }
    }

但现在我有一个问题,我们之前说到文件静态资源通过http://localhost:3000/upload_f16d68210c6822f1000ce11f363f0815.jpg 来访问,这个路径按上述思路配置代理:会导致前端路由也一起访问后端接口,导致一锅粥,这样是不对的。

     "/": {
        target: "http://localhost:3000"
      },

最后只能采取死办法,引入koa-cors 实现后台跨域,并且通过绝对路径: url: "http://localhost:3000/"+ data.imgPath.imgBathPath,来访问。

总结:

本次完成毕设遇到的问题都是通过查看文档 + 百度查询的方式,当然这些方法在脑海里也有大致的印象,这次做一个总结。

到此这篇关于vue3+koa实现文件上传功能的文章就介绍到这了,更多相关vue3+koa文件上传功能内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue实现文件上传

    本文实例为大家分享了vue实现文件上传的具体代码,供大家参考,具体内容如下 记录问题,方便回顾 1.使用elementUI的 el-upload插件进行上传. 2.使用input. 1.使用elementUI的 el-upload插件进行上传. html: <el-upload           ref="avatar-uploader"           class="avatar-uploader"           :show-file-list=

  • vue实现文件上传功能

    vue 文件上传,供大家参考,具体内容如下 首先 先说一下想要实现的效果 就如截图所见,需要将企业和需要上传的文件提交到后台处理,那么接下来就说如何实现 vue 实现 vue 页面代码 <el-upload class="upload-demo" ref="upload" action="doUpload" :limit="1" :file-list="fileList" :before-upload

  • koa2+vue实现登陆及登录状态判断

    这里我们先说说登陆以及登陆状态控制需要的插件jsonwebtoken,jsonwebtoken就可以实现token的生成与反向解密出用户数据. 安装步骤: npm install jsonwebtoken --save 安装之后先创建一个token.js, 为了项目目录的清晰,可以创建一个token文件夹,将token.js放到里面.文件创建OK之后,该是写内容了,写内容之前先说说jsonwebtoken提供的方法: 1.sign: 生成token.2.decod: 解析token. 这两个方法

  • Vue实现文件上传和下载功能

    本文实例为大家分享了vue + element ui实现锚点定位的具体代码,供大家参考,具体内容如下 1.a标签download属性 在H5中,为a标签新增了一个download属性,来直接文件的下载,文件名就是download属性文件名. download属性暂时只支持Google Chrome 和 Mozilla Firefox,其他浏览器均不支持该属性: download是H5新增的属性,H5以前没有该属性: 2.URL.createObjectURL URL.createObjectUR

  • vue+koa2搭建mock数据环境的详细教程

    前段时间写了一篇前端vue项目实现mock数据方式的文章,主要是在vue项目里使用mock数据,数据和项目耦合在一起,不太优雅,作为一个有追求的前端,怎么能容忍这种方法呢?特以此篇,记录利用koa2搭建服务端,提供mock数据的方法. 初始化vue项目 这里以vue项目为主,当然别的类型项目依然可以使用这种mock数据的方式. vue create vue-koa2-demo 前提是安装了vue-cli的脚手架,我电脑安装的是vue-cli3的版本.按照要求一步一步选择后,记得选择安装vuex,

  • vue3+koa实现文件上传功能的全过程记录

    目录 前言: 技术引用: 前端实现 后台实现: 引入koa-body,并注册中间件: 引入koa-static 进行静态资源访问 前台回显图片: 遇到的问题: 已解决: Token验证问题: proxy代理问题: 总结: 前言: 在完成自己的毕设中,需要引入文件上传,前后找到资料实现了图片上传,在此做一个总结 技术引用: 1. 使用了 koa-body 实现后台文件上传功能 2. 使用了 koa-static 实现后台资源静态访问 3. 使用了 Element plus UI的upload组件实

  • thinkjs 文件上传功能实例代码

    介绍 ThinkJS 是一款面向未来开发的 Node.js 框架,整合了大量的项目最佳实践,让企业级开发变得如此简单.高效.从 3.0 开始,框架底层基于 Koa 2.x 实现,兼容 Koa 的所有功能. 特性 基于 Koa 2.x,兼容 middleware 内核小巧,支持 Extend.Adapter 等插件方式 性能优异,单元测试覆盖程度高 内置自动编译.自动更新机制,方便快速开发 使用更优雅的 async/await 处理异步问题,不再支持 */yield 从 3.2 开始支持 Type

  • 使用php完成常见的文件上传功能(推荐)

    文件上传现在都是很常见的了,可以上传文件,上传头像等,不同的浏览器"文件上传"有不同的效果 先看下火狐浏览器的效果是这样的: 再看下IE浏览器是这样的: 还有很多其他的浏览器,就不一一的查看效果了,那么这个上传是怎么实现的呢? 一.文件上传功能 (1)第一是要有这个上传页面了 首先是要写表单元素了(其中就有处理页面"关于上传的处理了,其中有些规则可以写",还有传输方式,再就是一个重要的属性,因为是文件上传,所以要有这个属性:enctype="multipa

  • Spring MVC环境中文件上传功能的实现方法详解

    前言 我们在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像.商品图片.邮件附件等等.其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上传和下载有或多或少的封装,这里就以Spring MVC环境中文件的上传为例,讲解Spirng MVC环境下的文件上传功能实现.下面话不多说了,来一起看看详细的介绍吧. 一.客户端编程 由于多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要提供一个文件上传的表单

  • Struts2实现文件上传功能实例解析

    一. 搭建struts2环境 在myeclipse下,右击项目->MyEclipse->Project Facets->install Apache Struts2. 如要自己搭建,需下载struts2包,写struts.xml配置文件. web.xml文件配置如下: <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher

  • php+ajax实现图片文件上传功能实例

    目前常用的异步文件上传功能有几种,比较多见的如使用iframe框架形式,ajax功能效果,以及flash+php功能,下面介绍ajax与iframe实现异步文件上传的功能的例子. 方法一,利用jquery ajaxfileupload.js实现文件上传 其实就是实现无刷新式的文件上传.可采用IFRAME文件上传原理.实际上在用PHP上传文件时...只能用$_FILES形式,但是若我们只是单一的用JS方式取其ID,如<input id='img' type='file'>..document.g

  • PHP实现文件上传功能实例代码

    点击浏览,将所选的文件上传到创建的images文件夹内 代码如下: 1.wenjian.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">

  • Zend Framework实现多文件上传功能实例

    本文实例讲述了Zend Framework实现多文件上传功能的方法.分享给大家供大家参考,具体如下: 第一步:在我们原来教程找到library文件夹..这里原来是存放我们Zend类库文件夹的地方..现在我们在library文件夹里加上如下几个文件夹:library/Custom/Controller/Plugin/ 文件夹我们加入完成.这时候我们就要找到我们的文件上传的类文件了..这里我命名为Upload.php文件名..这个文件就是我们将要用到文件上传的的类文件.当然这文件我是改写成了Zend

  • Android基于Http协议实现文件上传功能的方法

    本文实例讲述了Android基于Http协议实现文件上传功能的方法.分享给大家供大家参考,具体如下: 注意一般使用Http协议上传的文件都比较小,一般是小于2M 这里示例是上传一个小的MP3文件 1.主Activity:MainActivity.java public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private EditText timel

  • Ajax配合Spring实现文件上传功能代码

    由于项目需要,开发一个可以上传图片到服务器的web表单页面. 一. 需求 Web表单页面,可以通过表单上传图片以及其他文字信息. 二. 图片上传的流程 之前没有做过这类页面,通过查询资料.发现比较常见的做法,是先将图片上传到服务器端的某个文件目录下,服务器向前台返回图片的存储路径:之后,前台将图片存储路径以及其他表单信息一起提交到服务器,所有的表单信息存储在数据库中. 三. 方法 由于项目需要,我这里介绍两种图片上传方法,第一种是使用ajax对一个图片直接上传:第二种是先在前台将图片切割为较小的

随机推荐