如何在 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使用vant中的checkbox实现全选功能
Nov 17 Vue.js
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
vue3自定义dialog、modal组件的方法
Jan 04 Vue.js
Vue实现图书管理案例
Jan 20 Vue.js
vue使用echarts画组织结构图
Feb 06 Vue.js
详解Vue的七种传值方式
Feb 08 Vue.js
用vite搭建vue3应用的实现方法
Feb 22 Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 Vue.js
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
vue3.0 数字翻牌组件的使用方法详解
Apr 20 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
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
jquery插件制作 提示框插件实现代码
2012/08/17 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
js取值中form.all和不加all的区别介绍
2014/01/20 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
Javascript的比较汇总
2016/07/25 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
写一个Vue loading 插件
2020/11/09 Javascript
python通过socket查询whois的方法
2015/07/18 Python
Django卸载之后重新安装的方法
2017/03/15 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
财务副总经理工作职责
2013/11/25 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
单位授权委托书范文
2014/08/02 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
2015年端午节活动总结
2015/02/11 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
世界名著读书笔记
2015/06/25 职场文书
孙振耀退休感言
2015/08/01 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书