如何在 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 tags 创建缓存导航的过程实现
Dec 03 Vue.js
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 Vue.js
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
手写Vue源码之数据劫持示例详解
Jan 04 Vue.js
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 Vue.js
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
Vue多选列表组件深入详解
Mar 02 Vue.js
vue完美实现el-table列宽自适应
May 08 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
vue实现列表垂直无缝滚动
Apr 08 Vue.js
vue项目打包后路由错误的解决方法
Apr 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
PHP中使用xmlreader读取xml数据示例
2014/12/29 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
如何实现JS函数的重载
2006/09/22 Javascript
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
优化innerHTML操作(提高代码执行效率)
2011/08/20 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
JavaScript DOM基础
2015/04/13 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
小程序云开发实战小结
2018/10/25 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
2021/03/04 Python
世界经理人咨询有限公司面试
2014/09/23 面试题
校园新闻广播稿5篇
2014/10/10 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
同学毕业留言寄语
2015/02/27 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
采购部年度工作总结
2015/08/13 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书