如何在 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-cli 创建模板项目
Nov 19 Vue.js
Vue router安装及使用方法解析
Dec 02 Vue.js
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
在vue中动态修改css其中一个属性值操作
Dec 07 Vue.js
vue3.0实现插件封装
Dec 14 Vue.js
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 Vue.js
vue watch监控对象的简单方法示例
Jan 07 Vue.js
vue使用echarts画组织结构图
Feb 06 Vue.js
Vue基本指令实例图文讲解
Feb 25 Vue.js
vue-cli中实现响应式布局的方法
Mar 02 Vue.js
vue里使用create, mounted调用方法
Apr 26 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调用Linux命令权限不足问题解决方法
2015/02/07 PHP
PHP里的单例类写法实例
2015/06/25 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
Laravel Reponse响应客户端示例详解
2020/09/03 PHP
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
jQuery倒计时代码(超简单)
2017/02/27 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
Python中文编码那些事
2014/06/25 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
使用Python实现windows下的抓包与解析
2018/01/15 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
采购部岗位职责
2013/11/24 职场文书
拖鞋店创业计划书
2014/01/15 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
2014全国两会学习心得体会1000字
2014/03/10 职场文书
家长对孩子的寄语
2015/02/26 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
销售经理岗位职责范本
2015/04/02 职场文书