zoukankan      html  css  js  c++  java
  • nui app sunui-upimg 上传图片,原文件显示问题与压缩问题

    vue  nui app   sunui-upimg 上传图片

    压缩图片sizeType: ["compressed"],    只有小程序-app才有效果 

     chooseImage() {
          let _self = this;
          uni.chooseImage({
            count: _self.upload_count - _self.upload_before_list.length,
            sizeType: ["compressed"],
            sourceType: ["album", "camera"],
            success:async function (res) {
        
                 // #ifdef H5
                 await _self.getImageInfo(res,res.tempFilePaths[0]);
                // #endif 
                // #ifdef MP-WEIXIN 
                    for (let i = 0, len = res.tempFiles.length; i < len; i++) {
                        res.tempFiles[i]["upload_percent"] = 0;
                        res.tempFiles[i]["path2"] =res.tempFiles[i]["path"];
                        _self.upload_before_list.push(res.tempFiles[i]);
                      }
                    
                      _self.upload_cache =res.tempFilePaths;
                      _self.upload(_self.upload_auto);
               // #endif
            },
            fail: function (err) {
              console.log(err);
            },
          });
        },
    

      h5  压缩功能问题,h5显示 竖图问题ctx.rotate(270 * Math.PI / 180)

     getImageInfo(res,src) {
            let _self = this
            	let imgSrc = '';
    				uni.getImageInfo({
    					src,
    					success(res2) {
    						let canvasWidth = res2.width //图片原始长宽
    						let canvasHeight = res2.height
    						let img = new Image()
    						img.src = res2.path
    						let canvas = document.createElement('canvas');
                let ctx = canvas.getContext('2d');    
    						canvas.width =canvasWidth/2;
                canvas.height =canvasHeight/2;
                if(canvasHeight>canvasWidth){
                canvas.width = canvasHeight/2;
                canvas.height =canvasWidth/2;
    
                 ctx.rotate(270 * Math.PI / 180);    
                ctx.drawImage(img, -canvasWidth/2, 0, canvasWidth/2, canvasHeight/2);  
                }else
    						ctx.drawImage(img, 0, 0, canvasWidth/2, canvasHeight/2);
    						canvas.toBlob(function(fileSrc) {
    							 imgSrc = window.URL.createObjectURL(fileSrc)
                  
             for (let i = 0, len = res.tempFiles.length; i < len; i++) {
                res.tempFiles[i]["upload_percent"] = 0;
                res.tempFiles[i]["path2"] =imgSrc;
                _self.upload_before_list.push(res.tempFiles[i]);
              }
             
              _self.upload_cache =[imgSrc];
              _self.upload(_self.upload_auto);
    						})
    					}
            })
    			},
    

      

     

    <template>
      <view class="sunui-uploader-bd">
        <view class="sunui-uploader-files">
    
          <block v-for="(item, index) in upload_before_list" :key="index">
             <!-- :class="[
                item.upload_percent < 100 ? 'sunui-uploader-file-status' : '',
              ]" -->
            <view   v-show="item.path2"
              class="sunui-uploader-file"         
              @click="previewImage(index)"
            >
              <!-- step1.这里修改服务器返回字段 !!! -->
              <image
                class="sunui-uploader-img"
                :style="upload_img_wh"
                :src="item.path2"
                mode="aspectFill" 
              />
              <view
                class="sunui-img-removeicon right"
                @click.stop="removeImage(index)"
                v-show="upimg_move"
                >×</view
              >
              <!-- <view class="sunui-loader-filecontent" v-if="item.upload_percent < 100">{{ item.upload_percent }}%</view> -->
            </view>
          </block>
          <view
            v-if="upload_before_list.length==0"
            hover-class="sunui-uploader-hover"
            class="sunui-uploader-inputbox"
            :class="upload_bg_img == 2 ? 'bg2' : ''"
            @click="chooseImage"
            :style="upload_img_wh"
          >
            <view>
              <!-- <text class="iconfont icon-mn_shangchuantupian" style="color: #666;"></text> -->
              <image class="icon-img" src="/static/img/photo.png" />
            </view>
          </view>
        </view>
      </view>
    </template>
    
    <script>
    export default {
      data() {
        return {
          upload_len: 0,
          upload_cache: [],
          upload_cache_list: [],
          upload_before_list: [],
          upload_before_listsss:[]
        };
      },
      name: "sunui-upimg",
      props: {
        // 服务器url
        url: {
          type: String,
          default:
            "https://a3.dns06.net.cn/app/index.php?i=2&c=entry&a=wxapp&do=Upload_qiniu_b&m=jzwx_a",
        },
        // 上传样式宽高
        upload_img_wh: {
          type: String,
          default: "100%;",
        },
        upload_bg_img: {
          type: String,
          default: "",
        },
        // 上传数量
        upload_count: {
          type: [Number, String],
          default: 1,
        },
        // 是否自动上传? 可以先用变量为false然后再改为true即为手动上传
        upload_auto: {
          type: Boolean,
          default: true,
        },
        // 是否显示删除
        upimg_move: {
          type: Boolean,
          default: true,
        },
        // 服务器预览图片
        upimg_preview: {
          type: Array,
          default: () => {
            return [];
          },
        },
        // 服务器返回预览(看服务器卡顿情况设定)
        upimg_delaytime: {
          type: [Number, String],
          default: 300,
        },
        // 请求头信息
        header: {
          type: Object,
          default: () => {
            return {};
          },
        },
      },
      async created() {
        let _self = this;
        setTimeout(() => {
          this.upload_before_list = this.upload_before_list.concat(
            this.upimg_preview
          );
          this.upload_len = this.upload_before_list.length;
          this.upimg_preview.map((item) => {
            // step2.这里修改服务器返回字段 !!!
            this.upload_cache_list.push(item.imgUrl.imgUrl);
          });
          this.emit();
        }, this.upimg_delaytime);
      },
      methods: {
        upImage(paths, header) {
          let _self = this;
          const promises = paths.map(function (path) {
            return promisify(upload)({
              url: _self.url,
              path: path,
              name: "file",
              extra: header,
              _self: _self,
            });
          });
    
          uni.showLoading({
            title: `正在上传...`,
          });
          console.log("upImage-promises",promises)
          Promise.all(promises)
            .then(function (data) {
              uni.hideLoading();
              _self.upload_cache_list.push(...data); 
                 console.log("upImage-upload_cache_list",data, _self.upload_cache_list)
                 console.log("upImage-upload_before_list", _self.upload_before_list)
                 var src=_self.upload_before_list[0].path2;
                     uni.getImageInfo({
                        src,
                        success(res2) {
                console.log('压缩后后后', res2)
                  }
              })
                 
               _self.emit();
            })
            .catch(function (res) {
              uni.hideLoading();
            });
        },
        chooseImage() {
          let _self = this;
          uni.chooseImage({
            count: _self.upload_count - _self.upload_before_list.length,
            sizeType: ["compressed"],
            sourceType: ["album", "camera"],
            success:async function (res) {
        
                 // #ifdef H5
                 await _self.getImageInfo(res,res.tempFilePaths[0]);
                // #endif 
                // #ifdef MP-WEIXIN 
                    for (let i = 0, len = res.tempFiles.length; i < len; i++) {
                        res.tempFiles[i]["upload_percent"] = 0;
                        res.tempFiles[i]["path2"] =res.tempFiles[i]["path"];
                        _self.upload_before_list.push(res.tempFiles[i]);
                      }
                    
                      _self.upload_cache =res.tempFilePaths;
                      _self.upload(_self.upload_auto);
               // #endif
            },
            fail: function (err) {
              console.log(err);
            },
          });
        },
        async upload(upload_auto) {
          let _self = this;
          upload_auto
            ? await _self.upImage(_self.upload_cache, _self.header)
            : console.warn(`传输参数:this.$refs.xx.upload(true)才可上传,默认false`);
        },
        getImageInfo(res,src) {
            let _self = this
                let imgSrc = '';
                    uni.getImageInfo({
                        src,
                        success(res2) {
                            let canvasWidth = res2.width //图片原始长宽
                            let canvasHeight = res2.height
                            let img = new Image()
                            img.src = res2.path
                            let canvas = document.createElement('canvas');
                let ctx = canvas.getContext('2d');    
                            canvas.width =canvasWidth/2;
                canvas.height =canvasHeight/2;
                if(canvasHeight>canvasWidth){
                canvas.width = canvasHeight/2;
                canvas.height =canvasWidth/2;
    
                 ctx.rotate(270 * Math.PI / 180);    
                ctx.drawImage(img, -canvasWidth/2, 0, canvasWidth/2, canvasHeight/2);  
                }else
                            ctx.drawImage(img, 0, 0, canvasWidth/2, canvasHeight/2);
                            canvas.toBlob(function(fileSrc) {
                                 imgSrc = window.URL.createObjectURL(fileSrc)
                  
             for (let i = 0, len = res.tempFiles.length; i < len; i++) {
                res.tempFiles[i]["upload_percent"] = 0;
                res.tempFiles[i]["path2"] =imgSrc;
                _self.upload_before_list.push(res.tempFiles[i]);
              }
             
              _self.upload_cache =[imgSrc];
              _self.upload(_self.upload_auto);
                            })
                        }
            })
                },
        previewImage(idx) {
          let _self = this;
          let preview = [];
          for (let i = 0, len = _self.upload_before_list.length; i < len; i++) {
            // step3.这里修改服务器返回字段 !!!
          console.log("previewImage-upload_before_list",_self.upload_before_list[i])
            preview.push(_self.upload_before_list[i].path);
          }
          uni.previewImage({
            current: idx,
            urls: preview,
          });
        },
        removeImage(idx) {
          let _self = this;
          _self.upload_before_list.splice(idx, 1);
          _self.upload_cache_list.splice(idx, 1);
          // _self.upload_before_listsss.splice(idx, 1);
          _self.upload_len = _self.upload_before_list.length;
          _self.emit();
        },
        emit() {
          let _self = this;
          _self.$emit("change", _self.upload_cache_list);
        },
      },
    };
    
    const promisify = (api) => {
      return function (options, ...params) {
        return new Promise(function (resolve, reject) {
          api(
            Object.assign({}, options, {
              success: resolve,
              fail: reject,
            }),
            ...params
          );
        });
      };
    };
    
    const upload = function (options) {
      let url = options.url,
        _self = options._self,
        path = options.path,
        name = options.name,
        // data = options.data,
        extra = options.extra,
        success = options.success,
        progress = options.progress,
        fail = options.fail;
    
      const uploadTask = uni.uploadFile({
        url: url,
        filePath: path,
        name: name,
        formData: extra,
        success: async function (res) {
          var data = res.data;
          // console.warn(
          //   "sunui-upimg - 如发现没有获取到返回值请到源码191行修改后端返回图片路径以便正常使用插件",
          //   JSON.parse(data)
          // );
          var s = JSON.parse(data);
          if (s.success) {
            // _self.upload_before_list[0].uri= s.data.uri;
            // _self.upload_before_list[0].path= s.data.path;
            // _self.upload_before_list[0].imgUrl= s.data.imgUrl.imgUrl;
              success( s.data);
          } else {
            uni.hideLoading();
            fail(data);
          }
        },
        fail: function (res) {
          if (fail) {
            fail(res);
          }
        },
      });
      uploadTask.onProgressUpdate(async function (res) {
        // for (let i = 0, len = _self.upload_before_list.length; i < len; i++) {
        //   _self.upload_before_list[i]["upload_percent"] = await res.progress;
        // }
        // _self.upload_before_list = _self.upload_before_list;
        _self.upload_len = _self.upload_before_list.length;
      });
    };
    </script>
    
    <style lang="scss">
    @font-face {
      font-family: "iconfont";
      src: url("//at.alicdn.com/iconfont.eot?t=1574391686418");
      /* IE9 */
      src: url("//at.alicdn.com/iconfont.eot?t=1574391686418#iefix")
          format("embedded-opentype"),
        /* IE6-IE8 */
          url("data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMkAAsAAAAAB2QAAALYAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcAqCYIJEATYCJAMICwYABCAFhG0HPRt3BhEVlCNkH4dxmzUXNsJHc1SNfR9KTkCtiXv/l+QDBQSFRBJdKoEsg60HUgCsOpWVnWxNx3BvVITqkj3fepbtzM/OfDo4D86iFEIiJAeX02+Bh/O84TLmsrEnYBxQoHtgm6xACoxTkN0zFsgEdQynCShpq7cwbsK0eTKROSkgbNu8cbUspRFrkoNMkC9ZGYWjcrJkX/IIR/zPhz/6hIxELmWmzdowfp1RvxdbYWm1VrUMCO54JvDrSNEbkTCv1DJDGvp6S5VUX9SRdSUHfi+u1cBZ7R+PQMgzEyugNcU5J67DO9VfJiCigD042iuNQqXSunGRfvrWV6/mvX49/+3bhW/eLHr4puOFtxMfvO5w9tX8yv7rIbf3Rrl84Mbe66XSzWet46nn/etMuALua5LqNZUqpKdfDKjsv2qef+yambJsTWM2zDtKIQ0pS7msvSTUpn1tNyts2xZmWUyw3LI4bPisSZNyOUc2y4/scfZs3QZ1UcgqUWtkVednsvnVs7NOHzmqglXIBnqU7+/M9Hp3y3L2RLWYA9uhlat61/LGGwVqt9Nvafv/8R2fmg/pu7LesH9ZOYL3/6e3P6Z2O0rbIztra+Dtc1u2RY1vapOocEtDiT0Kd1VUUkIN42joS19Fk1s1BVmKy0OioA2kMp1REdcbcsr6QV5mJJT0MnF9mbQRchZiET29CAT1fSBR1y1I1fdFRdwPcpr6Q179cIaSBaHRjmVdgxFjCSvGFuonmGYcpK1nESRfUC1dRUm+T3ggeeOEOIiywRwHpDHm+FUlzBIkjT1k5DzsuhEmGi02HGjmKQ1DWfaioBn7gzAWQRWGWqD2BIzGaCDRm4nc+y+QsuhUqKaqyviAiGcGB7FA1AKVS4ZWVddyibdSEoxJQCKjHsjIMNTpjMBUPsxCDRbQPTyTVGh1k20lwfyy/un2QYmpTII1I9Vo+1B4XQ2q0QvwvExGfTgA")
          format("woff2"),
        url("//at.alicdn.com/iconfont.woff?t=1574391686418") format("woff"),
        url("//at.alicdn.com/iconfont.ttf?t=1574391686418") format("truetype"),
        /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
          url("//at.alicdn.com/iconfont.svg?t=1574391686418#iconfont") format("svg");
      /* iOS 4.1- */
    }
    
    .iconfont {
      font-family: "iconfont" !important;
      font-size: 16px;
      font-style: normal;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    }
    
    .icon-mn_shangchuantupian {
      &:before {
        content: "e559";
      }
      font-size: 3em;
    }
    
    .sunui-uploader-img {
      display: block;
      height: 382upx;
      border-radius: 20upx;
    }
    .img {
      border-radius: 20upx;
    }
    .sunui-uploader-input {
      position: absolute;
      z-index: 1;
      top: 0;
      left: 0;
       100%;
      height: 100%;
      opacity: 0;
    }
    
    .sunui-uploader-inputbox {
      position: relative;
      box-sizing: border-box;
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      justify-content: center;
      min-height: 350upx;
      height: 382upx;
      background-image: url("/static/img/v4-icon4.png");
      background-repeat: no-repeat;
      background-size: 100%;
      border-radius: 18upx;
      background-position: left top;
    }
    .bg2 {
      background-image: url("/static/img/v4-icon3.png");
    }
    
    .sunui-img-removeicon {
      position: absolute;
      color: #fff;
       24px;
      height: 24px;
      line-height: 24px;
      z-index: 2;
      text-align: center;
      background-color: #fe3333;
      border-top-right-radius: 10px;
      border-bottom-left-radius: 10px;
    
      &.right {
        top: 0;
        right: 0;
      }
    }
    
    .sunui-uploader-file {
      position: relative;
      margin-bottom: 16rpx;
      border-radius: 20upx;
    }
    
    .sunui-uploader-file-status:before {
      content: " ";
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      background-color: rgba(0, 0, 0, 0.5);
      border-radius: 20upx;
    }
    
    .sunui-loader-filecontent {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      color: #fff;
      z-index: 9;
    }
    
    .sunui-uploader-bd {
      margin: 0;
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      justify-content: center;
    }
    
    .sunui-uploader-files {
       80.4%;
      border-radius: 20upx;
    }
    
    .sunui-uploader-file:nth-child(4n + 0) {
      margin-right: 0;
    }
    
    .sunui-uploader-inputbox > view {
      text-align: center;
    }
    
    // .sunui-uploader-file-status:after {
    //   content: " ";
    //   position: absolute;
    //   top: 0;
    //   right: 0;
    //   bottom: 0;
    //   left: 0;
    //   background-color: rgba(0, 0, 0, 0.5);
    // }
    
    // .sunui-uploader-hover {
    //   box-shadow: 0 0 0 #e5e5e5;
    //   background: #e5e5e5;
    // }
    
    .icon-img {
       116upx;
      height: 116upx;
    }
    </style>
    View Code
  • 相关阅读:
    SQL 查询第n条到第m条的数据
    Linq 中查询一个表中指定的字段
    归并排序与逆序对
    补码拾遗
    堆排序
    It is time to cut the Gordian Knot!
    蛋疼
    [引]Microsoft Visual Studio .NET 2005 预发行版
    关于VS2005中自动生成TableAdapter的事务处理
    关于释放ASPNET进程的内存占用问题.
  • 原文地址:https://www.cnblogs.com/FACESCORE/p/14116387.html
Copyright © 2011-2022 走看看