前端图片压缩后,文件流上传

蓝咒 提交于 2019-12-04 08:04:23

 

直接贴代码了

  使用的是vantUI框架,不过没有关系,都是对文件流进行判断压缩的。按需求改造一下就OK了

<template>
  <div class="page_publish">
    <div class="bg_box">

      <div class="form_box">
        <div class="con">
          <textarea
            class="textarea"
            v-model="formData.story"
            placeholder="经历了哪些有趣、快乐、感动的小故事...... ,写下来分享给我们吧"
          ></textarea>

          <div class="file_box">
            <van-uploader
              :before-read="beforeRead"
              :after-read="afterRead"
              v-model="fileList"
              multiple
              :max-count="3"
            >
              <div class="upload_btn flex flex-v flex-align-center flex-pack-center">
                <img src="../assets/imgs/icon_camaro.png" class="icon" />
                <p class="num" v-if="fileList.length==0">添加图片</p>
                <p class="num" v-else>({{fileList.length}}/3)</p>
              </div>
            </van-uploader>
          </div>
          <p class="limit_txt">(限20-200字)</p>
        </div>

        <!-- 姓名手机号 -->
        <div class="contact_box">
          <input type="text" placeholder="请输入您的姓名" v-model="formData.name" class="input" />
          <input
            style="margin-top:0.30rem;"
            type="number"
            placeholder="请输入您的手机号"
            class="input"
            v-model="formData.phone"
          />

          <span
            :to="{path:'/publish'}"
            @click="checkForm()"
            class="btn flex flex-align-center flex-pack-center"
          >书写故事</span>
        </div>
      </div>
    </div>

    <!-- 确认弹框 -->
    <div v-show="dialogSubmit" class="dialog_submit flex-v flex felx-align-center flex-pack-center">
      <div class="con">
        <p class="txt">
          确认文字、图片和个人信息无误 ?
          <br />ps:不要让大奖联系不到你哦~
        </p>
        <div class="btn_box flex flex-align-center flex-pack-justify">
          <button
            class="btn btn_l van-hairline--surround"
            @click="dialogSubmit=false;statistics3()"
          >我再改改</button>
          <button class="btn btn_r" @click="submit()">确认提交</button>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import { checkLogin } from "../assets/js/util.js";
import { imgUpload, addStory } from "../http/api.js";
import urlConfig from "../http/env.js";

import Vue from "vue";
import {
  Button,
  Toast,
  Dialog,
  Loading,
  ImagePreview,
  Uploader,
  Divider
} from "vant";
Vue.use(Toast, ImagePreview);

export default {
  data() {
    return {
      formData: {
        story: "果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明",
        name: "ss",
        phone: "13344443333",
        images: ""
      },
      dialogSubmit: false, //确认弹框
      fileList: [
        // Uploader 根据文件后缀来判断是否为图片文件
        // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明
      ]
    };
  },
  mounted() {
  },
  components: {
    [Uploader.name]: Uploader,
    [Divider.name]: Divider,
    [Loading.name]: Loading
  },
  methods: {
    // 确认提交
    submit() {
      let _this = this;
      this.dialogSubmit = false;
      this.statistics2();
      Toast.loading({
        message: "提交中...",
        forbidClick: true,
        duration: 0
      });
      this.unLoadImg()
        .then(res => {
          console.log(res);
          let params = {
            images: res, //    图片地址 ---非必填    string    多个地址之间用,号分隔
            name: this.formData.name, //    用户姓名---必填    string
            phone: this.formData.phone, //    用户号码---必填    string
            story: this.formData.story, //    文字内容---必填    string
            headUrl: this.headUrl,
            nickname: this.nickName
          };
          addStory(params).then(res => {
            console.log(res);
            this.clearForm();
            Toast.clear();
            Toast.success("提交成功,内容审核中!");
            setTimeout(function() {
              _this.$router.go(-1);
            }, 1500);
          });
        })
        .catch(err => {
          console.log(err);
          Toast.clear();
          Toast(err);
        });
    },// 上传图片
    unLoadImg() {
      let _this = this;
      let fileList = this.fileList;
      return new Promise(function(resolve, reject) {
        if (fileList.length == 0) {
          //没有图片
          resolve("");
        } else {
          // 有图片,上传
          let formData = new FormData();
          let files = fileList.forEach(function(item, i) {
            console.log(_this.convertBase64UrlToBlob(item.content));
            // formData.append('images',item.file)  //不压缩上传
            formData.append(
              "images",
              _this.convertBase64UrlToBlob(item.content),
              "file_" + Date.parse(new Date()) + ".jpg"
            ); // 文件对象
          });
          imgUpload(formData)
            .then(res => {
              if (res.code == "PY0000") {
                resolve(res.response.imageUrl);
              } else {
                reject(res.msg);
              }
            })
            .catch(err => {
              reject("图片上传失败");
            });
        }
      });
    },
    /**
     * 将以base64的图片url数据转换为Blob
     *            用url方式表示的base64图片数据
     */
    convertBase64UrlToBlob(urlData) {
      var arr = urlData.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      };
      return new Blob([u8arr], { type: mime });
    },
    // 返回布尔值
    beforeRead(file) {
      // console.log(file);
      if (file.type !== "image/jpeg" && file.type !== "image/png") {
        Toast("请上传 jpg/png 格式图片");
        return false;
      } else if (file.size > 1024 * 1024 * 4) {
        Toast("图片大小不可超过4M!");
        return false;
      };
      return true;
    },
    afterRead(file) {
      let _this = this;
      // 如果图片大小超过2M,则先压缩
      if(file.file.size > 1024 * 1024 * 2){
        var ready = new FileReader();
        /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
        ready.readAsDataURL(file.file);
        ready.onload = function() {
          var re = this.result;
          _this.canvasDataURL(re);
        };
      }
    },
    // 压缩图片
    canvasDataURL(path, obj, callback) {
      let _this = this;
      var img = new Image();
      img.src = path;
      img.onload = function() {
        var that = this;
        // 默认按比例压缩
        var w = that.width,
          h = that.height,
          scale = w / h;
        w = w;
        h = w / scale;
        var quality = 0.5; // 默认图片质量为0.5
        //生成canvas
        var canvas = document.createElement("canvas");
        var ctx = canvas.getContext("2d");
        // 创建属性节点
        var anw = document.createAttribute("width");
        anw.nodeValue = w;
        var anh = document.createAttribute("height");
        anh.nodeValue = h;
        canvas.setAttributeNode(anw);
        canvas.setAttributeNode(anh);
        ctx.drawImage(that, 0, 0, w, h);
        // quality值越小,所绘制出的图像越模糊
        var base64 = canvas.toDataURL("image/jpeg", quality);
        // 回调函数返回base64的值
        let length = _this.fileList.length;
        _this.fileList[length-1].content = base64;
      };
    },
    
  }
};
</script>

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!