node+vue实现文件上传功能

yizhihongxing

下面我将为您详细讲解“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日

相关文章

  • Vue3源码分析组件挂载创建虚拟节点

    下面是关于Vue3源码分析组件挂载创建虚拟节点的完整攻略。 什么是组件挂载 组件挂载是指在Vue生命周期的beforeMount阶段,组件实例被创建后,将组件的模板解析成虚拟DOM并挂载到指定的DOM元素上的过程。在Vue实现组件挂载的过程中,重要的一步是通过编译器将组件模板解析成渲染函数,进而通过渲染函数创建虚拟节点。 Vue3组件挂载的实现过程 在Vue…

    Vue 2023年5月27日
    00
  • 使用vue导出excel遇到的坑及解决

    当使用Vue来处理数据并导出Excel时,可能会遇到一些问题。以下是关于“使用Vue导出Excel遇到的坑及解决”的完整攻略,其中包含了解决这些问题的步骤和两个示例。 问题和解决方案 问题1:表格的样式丢失 当将数据导出到Excel时,原本应用的样式可能不会保留。这可能是因为Excel的格式化与HTML和CSS不同。 解决方案 可以使用 xlsx-style…

    Vue 2023年5月27日
    00
  • vue中ref引用操作DOM元素的实现

    在Vue.js中,可以通过ref指令来获取DOM元素的引用,这使得我们可以在Vue组件中直接操作DOM元素。下面是实现这一功能的步骤。 步骤一:在DOM元素上添加ref指令 要获取一个DOM元素的引用,我们需要给它添加ref指令并指定一个名称。ref指令可以添加在任何元素上,如下所示: <template> <div> <but…

    Vue 2023年5月29日
    00
  • vue中$nextTick的用法讲解

    关于“vue中$nextTick的用法讲解”的完整攻略,我会从以下几个方面详细讲解: $nextTick的概念及作用 $nextTick的基本用法 $nextTick的示例说明 1. $nextTick的概念及作用 在Vue.js中,异步更新DOM是一个核心特性。当我们对一个Vue实例的数据进行修改时,Vue会在内部进行异步更新DOM的操作,而不是直接同步更…

    Vue 2023年5月29日
    00
  • 详解IDEA社区版(Community)和付费版(UItimate)的区别

    详解IDEA社区版和付费版的区别 介绍 IntelliJ IDEA是一款功能强大的Java集成开发工具(IDE)。它有两个版本:社区版和付费版。社区版是免费的,而付费版有更多的功能和增强的特性。 社区版和付费版的主要区别 功能 付费版具有比社区版更高级的功能。例如,付费版包括对Web和企业开发的更好支持,包括Java、Scala、Kotlin和JavaScr…

    Vue 2023年5月28日
    00
  • vue离开当前页面触发的函数代码

    当用户离开Vue页面时,我们可以使用beforeRouteLeave路由导航守卫去触发相应的函数代码。下面,我将详细讲解该攻略的应用步骤和示例说明。 步骤一:添加路由导航守卫 在Vue的路由配置中添加beforeRouteLeave守卫,并指定它所要触发的函数代码。以下是守卫函数的结构: beforeRouteLeave(to, from, next) { …

    Vue 2023年5月28日
    00
  • 一起来学习Vue的组件间通信方式

    一起来学习Vue的组件间通信方式 在Vue开发中,组件是进行页面构建的基本单元。不同的组件之间经常需要进行通信,以达到共同完成某个任务的目的。本文将详细讲解Vue的组件间通信方式。 props 和 $emit Vue的组件实例只能向下传递数据。也就是说,顶层组件可以将数据传递到其子组件,子组件可以将数据传递到孙子组件,而孙子组件则不能直接向其父组件传递数据。…

    Vue 2023年5月27日
    00
  • 结合axios对项目中的api请求进行封装操作

    对项目中的API请求进行封装操作可以提高代码复用率和维护性,同时也能提高代码的可读性和可测试性。 以下是结合axios对项目中的API请求进行封装操作的攻略: 第一步:安装axios 在终端中运行以下命令,安装axios。 npm install axios –save 第二步:创建API请求封装文件 在项目src目录下新建一个api文件夹,用于存放API…

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