Vue上传本地到后台,后台接收图片数据

Vue上传文件

通过input使用自定义按钮上传本地图片到服务器上,写学校项目的时候有用到,记录一下免得以后忘记

前端代码

//上传按钮
<div class="btn_select" @click="selectLoadImg">
	<div>
		点击选择需要上传的图片
		<input type="file" name="file" accept="image/*"
		@change="changeImage()"
		ref="avatarInput"
		style="display: none"
		>
	</div>
</div>
<button type="submit" class="btn_submit" @click="upLoad">上传图片</button>

样式可以自己定义
在这里插入图片描述
input隐藏,绑定onchange事件,在自定义的div上使用方法出发input的方法

js的代码

//js代码
	selectLoadImg() {
      this.$refs.avatarInput.dispatchEvent(new MouseEvent("click"));
    },
    changeImage() {
      let files = this.$refs.avatarInput.files;
      let that = this;
      function readAndPreview(file) {
        that.file = file
        if (/\.(jpe?g|png|gif)$/i.test(file.name)) {
          let reader = new FileReader();
          reader.onload = function() {
            if (that.imgData !== this.result) {
              that.imgData = this.result // 这个是base64的数据格式
            }
          };
          reader.readAsDataURL(file);
        }
      }

      if (files) {
        [].forEach.call(files, readAndPreview);
      }
    }
    upLoad() {
      let imgFile = this.file;//获取到上传的图片
      let formData = new FormData();//通过formdata上传
      formData.append('file', imgFile)
      formData.append('userId', this.userId)
      this.axios({
        method: "post",
        url: "接口地址",
        data: formData,
        core: true
      })
        .then((res) => {
          console.log(res.data);
        })
        .catch((error) => {
        console.log(error);
      })

    },

主要使用了axios以及FormData进行数据的上传

后台的代码

使用的是koa框架进行接收前端发送的图片

const Router = require('koa-router')
const koa = require('koa');
const cors = require('koa-cors');
const koaBody = require('koa-body');
const fs = require('fs')
const path = require('path')
const app = new koa();
router = new Router()

app.use(cors()); // 用于解决跨域的问题
app.use(koaBody({
  multipart: true, // 开启文件上传,必须设置为true
  strict: false,
  formidable: {
    maxFileSize: 200 * 1024 * 1024,    // 设置上传文件大小最大限制,默认2M
    keepExtensions: true // 保留文件拓展名
  }
}))
app.use(require('koa-static')(__dirname + '/public'))

router.post('/upLoad', async (ctx) => {
  console.log(ctx.request.files.file) // 打印文件内容
   console.log(ctx.request.body) // 打印FormData的护具
  const file = ctx.request.files.file; // 获取上传文件
  // 创建可读流
  const reader = fs.createReadStream(file.path);
  let filePath = path.join(__dirname, 'public/upload/') + `${file.name}`;
  // 创建可写流
  const upStream = fs.createWriteStream(filePath);
  // 可读流通过管道写入可写流
  reader.pipe(upStream);
  console.log(filePath)
  ctx.body = {
    msg: '上传成功!',
    url:filePath
  };

})

// 装载子路由
router.use('/upLoad', router.routes(), router.allowedMethods())
// 加载路由中间件
app.use(router.routes()).use(router.allowedMethods())

app.listen(3000, () => {
  console.log("listening port 3000");
})

新人小白,第一次写博客,之前一直知道博客记录知识很重要,但是人太懒都不想写,导致很多之前用过的东西太久没用了,好多都要重新再去看资料学习,还是乖乖写个博客记录下来吧。

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值