vue3 + elementplus + koa2 + formData实现文件上传

大概思路

1、前端:使用formData(不会的话可以百度使用方式),将上传的文件和要传送到后台的其他数据一起放入formdata,请求后台接口的时候,参数为formdata即可

2、后台服务器:接收前端传输过来的数据,文件和其它数据要分开接收。这里涉及两个操作:①将文件写入文件夹②更新数据库

1、前端页面

<el-upload

                  class="avatar-uploader"

                  action="https://jsonplaceholder.typicode.com/posts/"

                  :show-file-list="false"

                  list-type="picture-card"

                  :on-success="handleAvatarSuccess"

                  :before-upload="beforeAvatarUpload"

                >

                <!--上传图片之后图片预览-->

                  <img v-if="imageUrl" :src="imageUrl" class="avatar" />

                  <i v-else class="el-icon-plus avatar-uploader-icon"></i>

                </el-upload>

//新增用户上传头像成功

    const handleAvatarSuccess = (res, file) => {

      console.log(file)

      imageUrl.value = URL.createObjectURL(file.raw);

      files.value = file.raw;

      // console.log(imageUrl.value,"新增上传的头像",file.raw,"文件")

    };

//新增用户获取用户头像和用户信息

    const getImg = (val) => {

      let formData = new FormData();

      if(files.value){

        formData.append("file", files.value);//获取文件信息

        // console.log("上传文件了",files.value);

       }

      if(val == 0){

        formData.append("userInfo", JSON.stringify(state.form));//把新增的用户信息装进去一并传到后台,对象要序列化,不然后台很可能取不到值

      }else{

        formData.append("userInfo", JSON.stringify(state2.form2));

      }

      // console.log("表单的值",state2.form2);

      return formData;

    }

    //点击新增请求接口

     const getForm = () => {

      const formData = getImg(0);

      state.dialogFormVisible = false;

      request.request({

        url:'/api/user/addUser',

        method:'post',

        data:formData,

         //这一句一定不能掉,要不然后台无法解析

         headers:{'Content-Type':'multipart/form-data'}

      }).then(res => {

                //处理结果

        }else{

             

      })

      

2、Koa2后台服务器接口

(1)准备工作(app.js当中)

const koaBody = require('koa-body'); //解析上传文件的插件

//处理静态资源文件

// const views = require("koa-views");

const serve = require("koa-static");  // npm install --save koa-static

const mount = require("koa-mount"); //npm install koa-mount

//koa-mount帮助文档链接:Koa挂载到特定路径 koa-mount 帮助文档

app.use(koaBody({

    multipart: true,

    formidable: {

        maxFileSize: 2000 * 1024 * 1024    // 设置上传文件大小最大限制,默认2M

    }

}))

//不将根暴露出去,暴露upload文件

app.use(mount('/upload',serve(path.join( __dirname,'./upload'))));

2、接口

const fs = require('fs');

//管理员新增用户

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

    let file = ctx.request.files.file;

    let addUserInfo = JSON.parse(ctx.request.body.userInfo);

    //查询用户是否存在

    const project = await userModel.findOne({

        where: {

          username:addUserInfo.username,

          password: addUserInfo.password

        }

      });

    if(project===null){

        if(file != null){

            // 创建可读流

            const reader = fs.createReadStream(file.path);

            const fileResource = process.cwd()+'/upload' + `/${file.name}`;

            // 创建可写流

            const upStream = fs.createWriteStream(fileResource);

            // 可读流通过管道写入可写流

            reader.pipe(upStream);

        }

        const newUser = await userModel.create({ 

            headPic:file.name,//数据库只存图片的名字

            username: addUserInfo.username,

            password: addUserInfo.password,

            role: addUserInfo.role,

            status: addUserInfo.status,

        });

        if(newUser){

            ctx.body=formatResponse("200",newUser,"success");

        }else{

            ctx.body=formatResponse("500",{msg:"新增失败!"},"fail");

        }

    }else{

        ctx.body=formatResponse("500",{msg:"该用户已存在!"},"fail");

    }

});

最后,在上传多个文件可能会出现的问题

上传多个文件,可以用遍历的方式,一个一个加进去

this.files.forEach(item => {

            formData.append("file", item);

 });

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过Vue3和Element Plus来实现商城首页,你可以按照以下步骤进行: 1. 安装VueElement Plus 首先,在项目中安装VueElement Plus。你可以通过npm或者yarn来进行安装。使用以下命令来安装VueElement Plus: ``` npm install vue@next npm install element-plus ``` 2. 创建Vue实例 在入口文件中,创建Vue实例,并将Element Plus导入Vue实例中,例如: ```javascript import { createApp } from 'vue'; import ElementPlus from 'element-plus'; import 'element-plus/dist/index.css'; import App from './App.vue'; const app = createApp(App); app.use(ElementPlus); app.mount('#app'); ``` 3. 创建商城首页组件 在components文件夹中创建一个名为Home.vue的组件,该组件将作为商城首页的容器。在该组件中,你可以使用Element Plus提供的组件来构建你的页面布局和样式。 4. 在Home.vue中引入Element Plus组件 在Home.vue文件中,使用如下代码引入Element Plus的组件: ```javascript <template> <el-container> <el-header>Header</el-header> <el-main>Main</el-main> <el-footer>Footer</el-footer> </el-container> </template> ``` 可以根据你的需求添加其他Element Plus组件,如Menu、Carousel等等。 5. 在App.vue中使用商城首页组件 在App.vue中使用Home.vue组件来展示商城首页。在App.vue中的template中,添加以下代码: ```javascript <template> <div> <Home/> </div> </template> <script> import Home from './components/Home.vue'; export default { components: { Home } } </script> ``` 6. 运行项目 现在,你可以运行你的项目,通过浏览器查看商城首页。使用以下命令来运行项目: ``` npm run serve ``` 以上就是使用Vue3和Element Plus实现商城首页的基本步骤。你可以根据自己的需求进一步完善和定制商城首页的界面设计和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值