NodeJS文件上传

2019-10-10  本文已影响0人  icaojinyu

使用multer上传文件,默认不会给文件添加扩展名

一、package.json

{
  "name": "file_upload",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "axios": "^0.19.0",
    "cors": "^2.8.5",
    "express": "^4.17.1",
    "multer": "^1.4.2",
    "randomstring": "^1.1.5",
    "vue": "^2.6.10"
  }
}

二、app.js

var express = require('express')
var multer = require('multer')
var randomstring = require('randomstring')
var path = require('path')
var app = express()

app.use(require('cors')())
app.use(express.json())

// 指定上传文件的存储目录及文件名
var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './uploads')
  },
  filename: function (req, file, cb) {
    var ext = path.extname(file.originalname)
    cb(null, randomstring.generate(44) + ext)
  }
})

var upload = multer({storage: storage})

app.post('/upload', upload.single('file'), (req, res) => {
  var file = req.file
  console.log(file)
  if (file) {
    file.url = `http://localhost:3000/${file.filename}`
    res.send(file)
  } else {
    res.send({
      msg: '老铁,别皮了,请上传文件吧'
    })
  }
})

// 静态资源访问
app.use(express.static('uploads'))
app.use(express.static('public'))

app.listen(3000, () => {
  console.log('http://localhost:3000')
})

三、upload_test.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script src="node_modules/axios/dist/axios.min.js"></script>
  <script src="node_modules/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
  <form @submit.prevent="upload" action="">
    <p>
      <input @change="fn" ref="file" type="file">
    </p>
    <p>
      <input type="submit">
    </p>
  </form>
</div>
<script>
  var http = axios.create({
    baseURL: 'http://localhost:3000'
  })

  Vue.config.productionTip = false
  Vue.prototype.$http = http


  new Vue({
    el: '#app',
    methods: {
      fn(){
        console.log(this.$refs.file.files)
      },
      upload() {
        var formData = new FormData()
        formData.append('file', this.$refs.file.files[0])
        this.$http.post('/upload', formData, {
          headers: {
            'content-type': 'multipart/form-data'
          }
        }).then((res) => {
          console.log(res.data)
        }).catch((err) => {
          console.log(err)
        })
      }
    }
  })
</script>
</body>
</html>
上一篇 下一篇

猜你喜欢

热点阅读