el-upload 上传图片及压缩

 <el-upload 
    :multiple="false" 
    :on-change="Upload"
    :show-file-list="false" 
    :auto-upload="false"
>
    <img v-if="url" :src="url" />
    <div v-else class="upload-z">+</div>
</el-upload>
 Upload(file) {
      const that = this

      const arr = ['jpeg', 'jpg', 'png', 'bmp']
      if (!arr.includes(that.regE(file.name, '.'))) {
        that.$message.error('图片只支持png,jpg,jpeg和bmp格式!')
        return
      }

      const reader = new FileReader()
      // ?将读取到的文件编码成DataURL
      reader.readAsDataURL(file.raw)
      // ?压缩图片
      reader.onload = function(ev) {
        try {
          if (file.size / 1024 / 1024 >= 5) {
            // ?读取图片来获得上传图片的宽高
            const img = new Image()
            img.src = ev.target.result
            img.onload = function(ev) {
              // ?将图片绘制到canvas画布上进行压缩
              const canvas = document.createElement('canvas')
              const context = canvas.getContext('2d')
              const imgwidth = img.width
              const imgHeight = img.height
              // ?按比例缩放后图片宽高;
              let targetwidth = imgwidth
              let targetHeight = imgHeight
              // ?/如果原图宽大于最大宽度
              if (targetwidth > targetHeight) {
                // ?原图宽高比例
                const scale = targetHeight / 1080
                ;(targetHeight = 1080), (targetwidth = targetwidth / scale)
              } else {
                // ?原图宽高比例
                const scale = targetwidth / 1920
                targetwidth = 1920
                targetHeight = targetHeight / scale
              }
              //  ?缩放后高度仍然大于最大高度继续按比例缩小
              canvas.width = targetwidth //canvas的宽=图片的宽
              canvas.height = targetHeight //canvas的高=图片的高
              context.clearRect(0, 0, canvas.width, canvas.height)
              context.drawImage(this, 0, 0, canvas.width, canvas.height)
              let data = ''

              //该参数设置输出图片的质量,取值区间是0-1,默认为0.92,值越小,图片质量越模糊
              let quality = 0.6
              data = canvas.toDataURL(img.src, quality)
              
              that.src= data  //回显
              that.uploadE(request) //上传接口
            }
          } else {
            console.log('小于', file)
           that.src= reader.result

            that.uploadE(request) //上传接口
          }
        } catch (error) {
          console.log('出现错误', error)
        }
      }
    },

el-upload 可以用于上传视频,但是它本身不具备视频压缩的功能。你需要借助其他工具来实现视频压缩功能,例如 FFmpeg、Handbrake 等。 以下是一种使用 FFmpeg 实现视频压缩的方法: 1. 安装 FFmpeg: ``` # Ubuntu sudo apt-get install ffmpeg # MacOS brew install ffmpeg ``` 2. 使用 FFmpeg 压缩视频: ``` ffmpeg -i input.mp4 -vf scale=640:-1 -c:v libx264 -crf 28 -preset veryslow -c:a copy output.mp4 ``` 这个命令将会将 `input.mp4` 文件压缩至 640 像素宽度,并使用 H.264 编码器将视频压缩至 CRF 值为 28 的质量等级。压缩速度会非常慢,但生成的视频质量会更好。 3. 将压缩后的视频上传到服务器: ``` <el-upload class="upload-demo" action="/upload" :before-upload="beforeUpload" :on-success="onSuccess" :on-error="onError" :show-file-list="false"> <el-button size="small" type="primary">点击上传</el-button> </el-upload> ``` 在 `beforeUpload` 方法中,你可以使用 `FormData` 将压缩后的视频文件添加到上传表单中: ``` beforeUpload(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { const formData = new FormData(); formData.append('file', this.dataURLtoBlob(reader.result)); this.uploadFormData = formData; resolve(); }; reader.onerror = error => reject(error); }); }, dataURLtoBlob(dataURL) { const arr = dataURL.split(','); const mime = arr[0].match(/:(.*?);/)[1]; const bstr = atob(arr[1]); let n = bstr.length; const u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], { type: mime }); } ``` 4. 在服务器端处理上传的视频文件。 在服务器端,你可以使用你喜欢的编程语言处理上传的视频文件。如果你使用的是 Node.js,你可以使用 `multer` 中间件来处理上传的文件: ``` 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, Date.now() + '-' + file.originalname) } }); const upload = multer({ storage: storage }); app.post('/upload', upload.single('file'), (req, res) => { console.log(req.file); res.send('上传成功!'); }); app.listen(3000, () => console.log('服务器已启动!')); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值