上传文件前后端实现

ezyk_cn 项目-上传文件前后端实现.

时间:2021.5.25

前端部分,主要的上传方式有三种 1.form 表单提交 2.formdata 提交
form 表单提交

通常的代码格式是这样的

<form name="form名称" action="请求地址"  method="请求类型" enctype ="multipart/form-data">
    <input type="file" name="">
    <input type="text" name="">
    <input type="submit" value="提交">
</form>
formdata 提交(axios 实现)

这是在现代的项目中,比较主流的方式。axios 通常采用 post 进行文件上传,也可写作 axios.post(url, file)的形式。

header 中的 Content-Type 需要设置为 ‘multipart/form-data’

<template>
  <div>
    <input ref="input" type="file" accept="image/png, image/jpeg" @change="handle_change" />
  </div>
</template>
<script>
  import axios from 'axios'
  export default {
    layout: 'blog',
    mounted() {},
    methods: {
      /**
       * @name 处理变更
       * @param {Object} ev 事件
       */
      handle_change(ev) {
        let formData = new FormData()
        let file = ev.target.files[0]
        formData.append('file', file)
        axios({
          method: 'post',
          url: 'http://127.0.0.1:9003/api/uploadImage',
          data: formData,
          headers: {
            'Content-Type': 'multipart/form-data'
          }
        }).then(function (res) {
          console.log('上传成功', res)
        })
      }
    }
  }
</script>
服务端实现

multer 是 express 官方的文件处理中间件,提供 multer 的处理,可以将 file 发送到指定的目录路径,同时,会将文件写入到 req.files 里去。

/*
 * @Author: Yang Kang
 * @Date: 2021-05-06 15:22:01
 * @LastEditors: Yang Kang
 * @LastEditTime: 2021-05-25 11:08:25
 */

const express = require('express')
const router = express.Router()
const multer = require('multer')
const md5 = require('md5-node')
// var upload = multer({ dest: './public/img' }).any()
let storage = multer.diskStorage({
  destination: function (req, file, cb) {
    //    指定文件存放路径
    cb(null, './assets/mood/imgs')
  },
  filename: function (req, file, cb) {
    // 指定文件名,先获取扩展,随机生成文件名保存给保存文件的方法
    //获取文件扩展名
    let exts = file.originalname.split('.')
    let ext = exts[exts.length - 1] //为了防止上传图片时,图片的名称中含多个点,从后面取最后一个解决问题
    let tmpname = Date.now() + parseInt(Math.random() * 9999) //时间戳+随机数生成文件名
    // tmpname = md5(tmpname)
    cb(null, `${md5(tmpname)}.${ext}`)
  }
})
let upload = multer({ storage: storage })
//单个文件上传
router.post('/uploadImage', upload.any(), (req, res) => {
  console.log(req.files)
  let file = req.files?.[0]
  res.json({
    code: '0000',
    type: 'single',
    originalname: file.originalname,
    path: file.path
  })
})

export default router

如图,结果成功上传了

avatar

avatar

原文链接
上传文件前后端实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值