如何在 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新手入门指导教程
Nov 18 Vue.js
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
Vue仿百度搜索功能
Dec 28 Vue.js
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 Vue.js
vue实现轮播图帧率播放
Jan 26 Vue.js
vue使用echarts画组织结构图
Feb 06 Vue.js
vue项目实现分页效果
Mar 24 Vue.js
Vue中Object.assign清空数据报错的解决方案
Mar 03 Vue.js
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
解决vue-router的beforeRouteUpdate不能触发
Apr 14 Vue.js
vue router 动态路由清除方式
May 25 Vue.js
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 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
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
laravel清除视图缓存的代码
2019/10/23 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
jQuery插件制作之参数用法实例分析
2015/06/01 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
移动前端图片压缩上传的实例
2017/12/06 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python分析apache访问日志脚本分享
2015/02/26 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Python实现登录接口的示例代码
2017/07/21 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
员工自我鉴定范文
2013/10/06 职场文书
法学专业应届生求职信
2013/10/16 职场文书
医科大学生的自我评价
2013/12/04 职场文书
项目开发计划书
2014/01/09 职场文书
设备售后服务承诺书
2014/05/30 职场文书
2014年共青团工作总结
2014/12/10 职场文书
工程部部长岗位职责
2015/02/12 职场文书