当前位置:首页 > VUE

vue node实现文件上传

2026-02-20 23:33:46VUE

实现文件上传的基本流程

前端使用Vue.js构建上传界面,后端使用Node.js(如Express框架)处理文件接收和存储。以下是具体实现方法:

前端Vue实现

创建文件上传组件,使用<input type="file">元素和FormData对象:

<template>
  <div>
    <input type="file" @change="handleFileChange" />
    <button @click="uploadFile">上传</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedFile: null
    }
  },
  methods: {
    handleFileChange(event) {
      this.selectedFile = event.target.files[0]
    },
    async uploadFile() {
      if (!this.selectedFile) return

      const formData = new FormData()
      formData.append('file', this.selectedFile)

      try {
        const response = await axios.post('/api/upload', formData, {
          headers: {
            'Content-Type': 'multipart/form-data'
          }
        })
        console.log('上传成功:', response.data)
      } catch (error) {
        console.error('上传失败:', error)
      }
    }
  }
}
</script>

后端Node.js实现

使用Express框架和multer中间件处理文件上传:

vue node实现文件上传

const express = require('express')
const multer = require('multer')
const path = require('path')

const app = express()

// 配置存储
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/') // 上传文件保存目录
  },
  filename: (req, file, cb) => {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
    cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname))
  }
})

const upload = multer({ storage: storage })

// 文件上传路由
app.post('/api/upload', upload.single('file'), (req, res) => {
  if (!req.file) {
    return res.status(400).send('未上传文件')
  }

  res.json({
    message: '文件上传成功',
    filename: req.file.filename,
    path: req.file.path
  })
})

app.listen(3000, () => {
  console.log('服务器运行在 http://localhost:3000')
})

文件大小限制和类型验证

前端可以添加基本验证:

// 在uploadFile方法中添加
if (this.selectedFile.size > 5 * 1024 * 1024) {
  alert('文件大小不能超过5MB')
  return
}

const allowedTypes = ['image/jpeg', 'image/png']
if (!allowedTypes.includes(this.selectedFile.type)) {
  alert('仅支持JPEG和PNG格式')
  return
}

后端使用multer的limits和fileFilter选项:

vue node实现文件上传

const upload = multer({
  storage: storage,
  limits: {
    fileSize: 5 * 1024 * 1024 // 5MB
  },
  fileFilter: (req, file, cb) => {
    const allowedTypes = ['image/jpeg', 'image/png']
    if (allowedTypes.includes(file.mimetype)) {
      cb(null, true)
    } else {
      cb(new Error('不支持的文件类型'))
    }
  }
})

进度显示实现

前端可以添加上传进度显示:

axios.post('/api/upload', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  },
  onUploadProgress: progressEvent => {
    const percentCompleted = Math.round(
      (progressEvent.loaded * 100) / progressEvent.total
    )
    console.log(percentCompleted + '%')
    // 可以更新UI显示进度
  }
})

安全性考虑

后端应添加安全措施:

// 防止目录遍历攻击
const sanitizeFilename = require('sanitize-filename')

// 在multer配置中使用
filename: (req, file, cb) => {
  const safeFilename = sanitizeFilename(file.originalname)
  cb(null, Date.now() + '-' + safeFilename)
}

这些方法组合起来可以构建一个完整的文件上传功能,从前端界面到后端处理,包括验证和进度显示等增强功能。

标签: 文件上传vue
分享给朋友:

相关文章

实现vue组件

实现vue组件

Vue 组件的基本实现 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。以下是实现 Vue 组件的几种方式: 单文件组件 (SFC) 使用 .vue 文件格式,…

vue实现通知

vue实现通知

Vue 实现通知功能的方法 使用 Vue 实现通知功能可以通过多种方式实现,以下是一些常见的方法: 使用 Vue 的全局事件总线 在 Vue 中可以通过事件总线实现通知功能。创建一个全局事件总线,然…

vue实现拖动

vue实现拖动

Vue实现拖动的常用方法 在Vue中实现拖动功能通常需要结合HTML5的拖放API或第三方库。以下是几种常见实现方式: 使用HTML5原生拖放API HTML5提供了原生拖放API,可以通过drag…

vue滑块实现

vue滑块实现

Vue滑块实现方法 使用原生HTML5 range input Vue中可以绑定原生HTML5的range类型input元素实现基础滑块功能: <template> <div&…

vue实现伸缩

vue实现伸缩

Vue实现伸缩功能的方法 使用CSS过渡和Vue的v-if或v-show 通过CSS的transition属性结合Vue的条件渲染指令(v-if或v-show)可以实现元素的伸缩效果。定义一个CSS类…

vue实现树目录

vue实现树目录

Vue 实现树形目录 在 Vue 中实现树形目录可以通过递归组件或第三方库(如 element-ui 的 el-tree)完成。以下是两种常见实现方式: 递归组件实现 递归组件适合自定义程度高的树形…