如何在 Vue 表单中处理图片


Posted in Vue.js onJanuary 26, 2021

问题:

我在 Vue 中有一个 form 表单,用于上传博客帖子,它有标题、正文、描述、片段和图片等范围。所有的一切都是必需的。我在 Express 中设置了一个 API 来处理这个问题。我在 Postman 中测试正常,但是我不知道如何通过浏览器将文件发送给数据库。我一直收到 500 错误,并且我将数据打印到控制台,而图片字段为空,所以我确信这就是问题所在,但我就是搞不清楚怎么办。

这是我前端页面的 form 表单:

<template>
 <div class="container">
  <div id="nav">
   <adminnav/>
  </div>
  <div id="create">
   <h1>Create new post</h1>
  </div>
  <div id="post">
   <body>
    <form>
     <label for="title">Title: </label>
     <textarea v-model=formdata.title rows="5" cols="60" name="title"
      placeholder="Enter text">
     </textarea>
     <br/>
     <label for="body">Body: </label>
     <textarea v-model=formdata.body rows="5" cols="60" name="body"
      placeholder="Enter text">
     </textarea>
     <br/>
     <label for="description">Description: </label>
     <textarea v-model=formdata.description rows="5" cols="60" name="description"
      placeholder="Enter text">
     </textarea>
     <br/>
     <label for="snippet">Snippet: </label>
     <textarea v-model=formdata.snippet rows="5" cols="60" name="snippet"
      placeholder="Enter text">
     </textarea>
     <br/>
     <label for="file">Upload photo: </label>
     <input
      class="form-control-file"
      type="file"
      accept="image/*"
      v-bind="formdata.photo"
     />
     <br/>
     <input id="submit" type="submit" value="submit" @click.prevent="createPost()"/>
    </form>
   </body>
  </div>
 </div>
</template>

<script>
import adminnav from '../components/adminnav.vue';
import PostService from '../service/PostService';

export default {
 name: 'createStory',
 components: {
  adminnav,
 },
 data() {
  return {
   formdata: {
    title: '',
    body: '',
    description: '',
    snippet: '',
    photo: null,
   },
  };
 },
 methods: {
  createPost() {
   console.log(this.formdata);
   /* eslint prefer-destructuring: 0 */
   const formdata = this.formdata;
   PostService.createPost(formdata)
    .then(() => {
     console.log('success');
    });
  },
 },
};
</script>

这是 POST 请求。

router.post("/add-story", upload.single('photo'), async(req, res) => {
 try{
  let post = new Post();
  post.title = req.body.title;
  post.description = req.body.description;
  post.photo = req.file.location;
  post.body = req.body.body;
  post.snippet = req.body.snippet;

  await post.save();

  res.json({
   status: true,
   message: "Successfully saved."
  });

 } catch(err) {
  res.status(500).json({
   success: false,
   message: err.message
  });
 }
});

解决方法

让我们监视文件 <input> 中的 change 事件。这样可以确保每次用户的上传行为触发 updatePhoto 方法并把文件数据储存到 this.photo

<input type="file" accept="image/*" class="form-control-file"
  @change="updatePhoto($event.target.name, $event.target.files)"
>

编码去收集所有的数据并发送请求

// vue组件的其他部分
data () {
  return {
    title: '',
    body: '',
    description: '',
    snippet: '',
    photo: {} // 储存文件数据
  };
},
methods: {
  updatePhoto (files) {
    if (!files.length) return;

    // 存储文件数据
    this.photo = {
      name: files[0].name,
      data: files[0]
    };
  },
  createPost() {
    let formData = new FormData();

    formData.append('title', this.title);
    formData.append('body', this.body);
    formData.append('description', this.description);
    formData.append('snippet', this.snippet);
    formData.append('photo', this.photo.data, this.photo.name);

    PostService.createPost(formdata)
    .then(() => {
      console.log('success');
    });
  }
}
// vue组件的其他部分

很明显,我跳过了很多事情,比如整个 vue 组件结构,我相信它与这个问题无关,还有一些确保在启动请求之前文件数据可用的检查等等。这是一个关于如何获取文件数据的想法,所以希望这个答案能启发您。

以上就是如何在 Vue 表单中处理图片的详细内容,更多关于Vue 表单中处理图片的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue+iview分页组件的封装
Nov 17 Vue.js
Vue 的 v-model用法实例
Nov 23 Vue.js
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 Vue.js
vue中配置scss全局变量的步骤
Dec 28 Vue.js
vue中使用echarts的示例
Jan 03 Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
vue实现轮播图帧率播放
Jan 26 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
深入理解Vue的数据响应式
May 15 Vue.js
vue-element-admin项目导入和导出的实现
May 21 Vue.js
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
Vue2.0搭建脚手架
Mar 13 Vue.js
Vue实现摇一摇功能(兼容ios13.3以上)
Jan 26 #Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 #Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 #Vue.js
如何在Vue项目中添加接口监听遮罩
Jan 25 #Vue.js
使用vue3重构拼图游戏的实现示例
Jan 25 #Vue.js
vue 计算属性和侦听器的使用小结
Jan 25 #Vue.js
vue keep-alive的简单总结
Jan 25 #Vue.js
You might like
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
python生成随机红包的实例写法
2019/09/02 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
Zooplus葡萄牙:欧洲领先的网上宠物商店
2018/07/01 全球购物
英国Lookfantastic中文网站:护肤品美妆美发购物(英国直邮)
2020/04/27 全球购物
土建技术员岗位职责
2015/04/11 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
2015初中团委工作总结
2015/07/28 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python