node+vue实现文件上传功能

下面我将为您详细讲解“node+vue实现文件上传功能”的完整攻略。

技术实现方案

实现文件上传功能需要前后端协同完成,一般采用以下技术方案:

  • 前端:Vue + element-ui
  • 后端:Node.js + Express
  • 存储:阿里云 OSS 或者本地文件系统

前端实现

准备工作

1.在项目中引入 element-ui 和 axios

npm install element-ui axios -S

2.在项目中引入 Vue 和 element-ui 的样式

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)

HTML 代码

<template>
  <div class="upload">
    <el-upload
      class="upload"
      action="/api/upload"
      :on-success="handleSuccess"
      :on-error="handleError"
      :with-credentials="true"
      :show-file-list="false"
      :before-upload="beforeUpload"
    >
      <el-button type="primary">上传文件</el-button>
    </el-upload>
  </div>
</template>

JS 代码

<script>
import axios from 'axios'

export default {
  data() {
    return {}
  },
  methods: {
    beforeUpload(file) {
      this.loading = true
      const isJPG = file.type === 'image/jpeg'
      const isPNG = file.type === 'image/png'
      const isPDF = file.type === 'application/pdf'
      if (!isJPG && !isPNG && !isPDF) {
        this.$message.error('上传文件格式只能为 JPG/PNG/PDF 格式')
        return false
      }
    },
    handleSuccess(response, file, fileList) {
      console.log(response)
      this.$message({
        message: '上传成功',
        type: 'success'
      })
    },
    handleError(error, file, fileList) {
      this.$message({
        message: '上传失败,请重试',
        type: 'error'
      })
    }
  }
}
</script>

说明

  • 在 template 中,我们使用了 element-ui 的 upload 组件,设置了上传接口、上传成功和失败的回调函数、上传前的校验以及按钮文字。
  • 在 script 中,我们使用了 axios 发送请求,实现了上传文件的功能。beforeUpload 方法实现了文件格式的校验,handleSuccess 和 handleError 方法分别用于处理上传文件成功和失败的情况。

后端实现

准备工作

1.通过 npm 安装依赖包 express、multer 和 fs

npm install express multer fs

2.在 app.js 中添加上传文件的路由

const express = require('express')
const app = express()
const multer = require('multer')
const fs = require('fs')
const upload = multer({ dest: 'temp/' }) // 上传文件临时存储目录

app.post('/api/upload', upload.single('file'), function(req, res) {
  // 获取文件信息
  const file = req.file
  // 获取文件类型
  const fileType = file.mimetype.split('/')[1]
  // 获取文件名称
  const fileName = file.originalname.split('.')[0] + '-' + Date.now() + '.' + fileType
  // 获取文件路径
  const filePath = `./uploads/${fileName}`
  // 读取文件流
  var readable = fs.createReadStream(file.path)
  // 写入文件流
  var writable = fs.createWriteStream(filePath)
  readable.pipe(writable)
  res.send({
    code: 200,
    msg: '上传成功',
    data: {
      fileName: fileName,
      url: `http://localhost:${port}/uploads/${fileName}` // 访问文件地址
    }
  })
})

说明

  • 在后端代码中,我们使用了 express 的中间件 multer,实现了上传文件的功能。
  • 通过 fs 模块读取上传的文件流,然后将其写入到指定目录下,最后返回上传结果。

示例说明

下面是两个文件上传示例:

示例一:上传图片

上传图片需要使用 JPG 或 PNG 格式的图片。

前端代码:

<template>
  <div class="upload">
    <el-upload
      class="upload"
      action="/api/upload"
      :on-success="handleSuccess"
      :on-error="handleError"
      :with-credentials="true"
      :show-file-list="false"
      :before-upload="beforeUpload"
    >
      <el-button type="primary">上传图片</el-button>
    </el-upload>
  </div>
</template>

后端代码:

app.post('/api/upload', upload.single('file'), function(req, res) {
  // 获取文件信息
  const file = req.file
  // 获取文件类型
  const fileType = file.mimetype.split('/')[1]
  // 获取文件名称
  const fileName = file.originalname.split('.')[0] + '-' + Date.now() + '.' + fileType
  // 获取文件路径
  const filePath = `./uploads/${fileName}`
  // 读取文件流
  var readable = fs.createReadStream(file.path)
  // 写入文件流
  var writable = fs.createWriteStream(filePath)
  readable.pipe(writable)
  res.send({
    code: 200,
    msg: '上传成功',
    data: {
      fileName: fileName,
      url: `http://localhost:${port}/uploads/${fileName}` // 访问文件地址
    }
  })
})

示例二:上传 PDF 文件

上传 PDF 文件需要使用 PDF 格式的文件。

前端代码:

<template>
  <div class="upload">
    <el-upload
      class="upload"
      action="/api/upload"
      :on-success="handleSuccess"
      :on-error="handleError"
      :with-credentials="true"
      :show-file-list="false"
      :before-upload="beforeUpload"
    >
      <el-button type="primary">上传 PDF 文件</el-button>
    </el-upload>
  </div>
</template>

后端代码:

app.post('/api/upload', upload.single('file'), function(req, res) {
  // 获取文件信息
  const file = req.file
  // 获取文件类型
  const fileType = file.mimetype.split('/')[1]
  // 获取文件名称
  const fileName = file.originalname.split('.')[0] + '-' + Date.now() + '.' + fileType
  // 获取文件路径
  const filePath = `./uploads/${fileName}`
  // 读取文件流
  var readable = fs.createReadStream(file.path)
  // 写入文件流
  var writable = fs.createWriteStream(filePath)
  readable.pipe(writable)
  res.send({
    code: 200,
    msg: '上传成功',
    data: {
      fileName: fileName,
      url: `http://localhost:${port}/uploads/${fileName}` // 访问文件地址
    }
  })
})

以上就是实现文件上传功能的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node+vue实现文件上传功能 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 详解在Vue中有条件地使用CSS类

    针对“详解在Vue中有条件地使用CSS类”的主题,我为大家准备了以下攻略: 1. 组件属性绑定方式 在Vue中,我们可以使用v-bind指令将一个属性绑定到组件的属性上,通过这种方式,我们就可以很方便地切换元素的样式,来达到我们的需求。 示例1: 利用v-bind指令绑定CSS类 <template> <div :class="{…

    Vue 2023年5月28日
    00
  • Vue基础之侦听器详解

    Vue基础之侦听器详解 在Vue中,我们可以通过侦听器来监听组件内部数据的变化并做相应的处理。侦听器可以观察数据的变化并在变化时执行一些操作。在本篇文章中,我们将深入探讨Vue的侦听器,包括如何定义侦听器,侦听器的使用场景以及一些示例。 定义侦听器 我们可以在Vue组件内定义侦听器,在组件的watch选项中添加需要侦听的数据和相应的处理函数即可。定义侦听器的…

    Vue 2023年5月27日
    00
  • 使用Vue实现一个树组件的示例

    下面是使用Vue实现一个树组件的完整攻略。 确定需求 在实现一个树组件之前,首先需要明确需求,确定树组件需要实现的功能和样式等。例如,树组件需要拥有以下功能: 以树状结构展示数据; 支持节点的折叠和展开; 支持节点的选中和取消选中; 支持自定义节点的内容和样式。 根据以上需求,我们可以开始编写树组件的代码。 实现树组件 编写组件基础结构 使用Vue实现树组件…

    Vue 2023年5月28日
    00
  • vue 移动端注入骨架屏的配置方法

    下面我会详细讲解在 Vue 移动端项目中如何注入骨架屏。 什么是骨架屏? 骨架屏是一种用于提高移动端用户体验的技术,它是在页面内容还未加载完成时展示的一种占位元素,可以提高用户对页面加载进度的感知。骨架屏通常采用灰色填充块线条等元素,展示页面结构和布局,让用户感知到页面正在加载内容。 注入骨架屏的配置方法 在 Vue 移动端项目中,可以使用 vue-skel…

    Vue 2023年5月28日
    00
  • vue中向data添加新属性的三种方式小结

    下面是详细讲解 “vue中向data添加新属性的三种方式小结” 的攻略: 方式一:使用 Vue.set() 或 this.$set() Vue提供了 Vue.set() 和 this.$set() 方法,可以动态向data中添加属性,实现数据双向绑定。 <template> <div> <h2>{{ person.name…

    Vue 2023年5月28日
    00
  • webpack + vue 打包生成公共配置文件(域名) 方便动态修改

    要实现“webpack + vue 打包生成公共配置文件(域名) 方便动态修改”,可以参照以下步骤: 创建配置文件在项目根目录下创建一个config.js文件,用于存放公共配置信息,例如域名、API地址等。在文件中定义一个对象,包含需要的配置信息。示例代码如下: “`javascript// config.js module.exports = { dom…

    Vue 2023年5月28日
    00
  • Vue v-model实现案例介绍

    让我们来详细讲解“Vue v-model实现案例介绍”的完整攻略。 什么是Vue v-model? Vue是一个流行的JavaScript框架,v-model是Vue的一个指令,用于在表单控件和Vue实例之间建立双向数据绑定。 通过使用v-model指令,当用户在表单控件中输入内容时,Vue实例中的相应数据将自动更新。同时,当在Vue实例中更新数据时,表单控…

    Vue 2023年5月27日
    00
  • 浅谈AngularJs 双向绑定原理(数据绑定机制)

    浅谈AngularJs 双向绑定原理(数据绑定机制) 什么是双向绑定 双向绑定指的是将视图和模型之间的数据绑定在一起,使得当视图的数据发生变化时,模型中的数据也会自动更新;同样,当模型中的数据被修改时,视图中的数据也会跟着改变。这种机制可以减轻开发人员的负担,提高开发效率。 AngularJs 中双向绑定的原理 AngularJs 是一种基于MVVM模型的框…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部