关于vue框架上传组件上传图片格式正确但在不同设备提示格式不正确问题

一、问题来源

上周客户反映系统上传图片,总是提示图片格式不正确,图片发过来,发现图片格式是 'jpeg', 'png', 'jpg'格式,并且我尝试上传了一次,并没有提示格式不正确。很是奇怪和纳闷。经远程发现,对方的图片格式是大写的,如:JPEG,PNG,JPG。然后我把自己的图片格式改成大写的,然后上传,发现的确提示格式不正确。然后个人斗胆猜想==>图片在经聊天软件传输的过程中,经一台设备到另一台设备,图片格式由大写转换成了小写,于是我是能够上传的,而客户是不可以的。

二、解决方案

方案一:

通过上传组件的便利,可以在上传前获取到图片的格式,不管是大写还是小写格式,统一转换成小写格式,代码如下:

 // 上传文件之前
    beforeUpload(file) {
      const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1).toLowerCase();
      const whiteList = ['jpeg', 'png', 'jpg']
      if (whiteList.indexOf(fileSuffix) === -1) {
        this.$message.error('上传文件格式不对')
        return false
      }
      const isLt5M = file.size / 1024 / 1024 < 5
      if (!isLt5M) {
        this.$message.error('上传文件大小不能超过 5MB', 'error')
        return false
      }
    },

方案二:

 // 上传文件之前
    beforeUpload(file) {
      const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
      const whiteList = ['jpeg', 'png', 'jpg','JPEG', 'PNG', 'JPG']
      if (whiteList.indexOf(fileSuffix) === -1) {
        this.$message.error('上传文件格式不对')
        return false
      }
      const isLt5M = file.size / 1024 / 1024 < 5
      if (!isLt5M) {
        this.$message.error('上传文件大小不能超过 5MB', 'error')
        return false
      }
    },

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 安装element-ui和axios ``` npm install element-ui axios ``` 2. 在main.js中引入element-ui和axios ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import axios from 'axios' Vue.use(ElementUI) Vue.prototype.$axios = axios ``` 3. 在组件中使用el-upload组件 ```html <template> <div> <el-upload class="upload-demo" action="/api/upload" :on-success="handleSuccess" :before-upload="beforeUpload" :headers="{Authorization: token}"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </div> </template> ``` 其中,action是上传的接口地址,on-success是上传成功后的回调函数,before-upload是上传前的钩子函数,headers是请求头部,可以传递token等信息。 4. 在methods中定义handleSuccess和beforeUpload函数 ```javascript methods: { handleSuccess(response, file, fileList) { console.log(response) // 在这里处理上传成功后的响应数据 }, beforeUpload(file) { const isJPG = file.type === 'image/jpeg' || file.type === 'image/png' const isLt500K = file.size / 1024 < 500 if (!isJPG) { this.$message.error('上传图片只能是 JPG/PNG 格式!') } if (!isLt500K) { this.$message.error('上传图片大小不能超过 500KB!') } return isJPG && isLt500K } } ``` 在beforeUpload函数中,可以对上传的图片进行格式、大小等限制。 5. 在后接口中处理上传的图片 在后接口中,可以使用express框架的multer中间件来处理上传的图片。安装multer: ``` npm install multer ``` 在express中引入multer,并设置上传的文件夹: ```javascript const express = require('express') const multer = require('multer') const app = express() const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/') }, filename: function (req, file, cb) { cb(null, file.fieldname + '-' + Date.now() + '.jpg') } }) const upload = multer({ storage: storage }) app.post('/api/upload', upload.single('file'), (req, res) => { console.log(req.file) // 在这里处理上传成功后的响应数据 }) ``` 在这里,上传的文件会被保存到uploads文件夹下,文件名会以字段名和时间戳命名。 注意:在使用express中间件处理上传文件时,需要使用body-parser中间件。安装body-parser: ``` npm install body-parser ``` 在express中引入body-parser: ```javascript const bodyParser = require('body-parser') app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) ``` 完整代码如下: ```javascript const express = require('express') const multer = require('multer') const bodyParser = require('body-parser') const app = express() const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/') }, filename: function (req, file, cb) { cb(null, file.fieldname + '-' + Date.now() + '.jpg') } }) const upload = multer({ storage: storage }) app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) app.post('/api/upload', upload.single('file'), (req, res) => { console.log(req.file) // 在这里处理上传成功后的响应数据 }) app.listen(3000, () => console.log('Server is running...')) ``` 注意:在使用element-ui的上传组件时,需要设置上传的文件类型和大小限制,但是这只是客户的限制,如果后没有做相应的处理,仍然可以上传非指定类型和大小的文件,因此,在后接口中也需要对上传的文件进行相应的限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值