当前位置:首页 > 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中间件处理文件上传:

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选项:

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显示进度
  }
})

安全性考虑

后端应添加安全措施:

vue node实现文件上传

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

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

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

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

相关文章

vue 实现筛选

vue 实现筛选

实现筛选功能的基本方法 在Vue中实现筛选功能通常涉及以下几个核心步骤: 数据绑定与筛选逻辑 使用v-model绑定筛选条件到Vue实例的数据属性,结合计算属性实现动态筛选: data() {…

vue搜索功能实现

vue搜索功能实现

Vue搜索功能实现方法 在Vue中实现搜索功能可以通过多种方式完成,以下是几种常见的方法: 使用计算属性实现搜索 计算属性非常适合处理需要根据输入值动态过滤数据的情况。创建一个计算属性,根据搜索关键…

vue 实现登录跳转

vue 实现登录跳转

实现登录跳转的核心逻辑 在Vue中实现登录跳转通常涉及路由守卫、状态管理和API交互。以下是具体实现方式: 配置路由守卫 在路由配置文件中添加beforeEach守卫,检查用户是否已登录。未登录时重…

vue 实现模态框

vue 实现模态框

Vue 实现模态框的方法 使用组件化方式创建模态框 在 Vue 中,可以通过组件化方式创建一个可复用的模态框组件。以下是一个简单的实现示例: <template> <div c…

vue实现复制文本

vue实现复制文本

实现复制文本的方法 在Vue中实现复制文本功能可以通过以下几种方式实现,每种方法适用于不同的场景。 使用原生JavaScript的execCommand方法 虽然execCommand方法已逐渐被弃…

vue实现dialog窗口

vue实现dialog窗口

Vue 实现 Dialog 窗口的方法 使用组件化方式实现 Dialog 在 Vue 中可以通过组件化方式实现 Dialog 窗口。创建一个可复用的 Dialog 组件,利用 v-model 控制显示…