h5 端图片上传-模拟多张上传

Posted 我爱小明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了h5 端图片上传-模拟多张上传相关的知识,希望对你有一定的参考价值。

1、由于后端的限制,上传图片到服务器只能的一张一张传
2、显示图片预览是本地的图片
3、根据服务器返回的结果拿到相应的路径保存到提交评论的接口中
4、删除的时候,需要删除对应的路径,不要把删除的提交到评论的接口中

A、comment-detail.js

var status = common.getQueryStr("status");
var subsId = common.getQueryStr("subsId");
var isList = common.getQueryStr("isList");
var prodId = common.getQueryStr("prodId");

var CommentDetail = {
    point : 5,
    commentCon: ‘‘,
    uploadImg:[],
    everyUploadCount:0,
    layerLoadingIndex:null,
    submitComment : function (param) {
        var obj = param.obj;
        obj.click(function(){
            var url = ‘/app/comment‘;
            if(CommentDetail.commentCon.length<10){
                alert("文字最少限制10字");
                return;
            }
            if(CommentDetail.commentCon.length>500){
                alert("文字最多限制500字");
                return;
            }
            var imagesUrl = ‘‘;
            for(var i=0;i<CommentDetail.uploadImg.length;i++){
                if(i==CommentDetail.uploadImg.length-1){
                    imagesUrl += CommentDetail.uploadImg[i].savepath;
                }else{
                    imagesUrl += CommentDetail.uploadImg[i].savepath +‘,‘;
                }
            }
            var params = {
                "reqBody":{
                    "bossProdId" : prodId,
                    "content" : CommentDetail.commentCon,
                    "subsId" : subsId,
                    "score" : CommentDetail.point,
                    "images": imagesUrl
                }
            }
            common.ajax("POST",url,params,null,function (ret) {
                if(ret.resultCode==0){
                    alertDialog(‘提交成功‘,function () {
                        $("#go-to-back").click();
                    });
                }
            });
        });
    },
    imgFileUpload : function () {
        var input = document.getElementById("imgFileUpload");
        var result,div;

        if(typeof FileReader===‘undefined‘){
            result.innerhtml = "抱歉,你的浏览器不支持 FileReader";
            input.setAttribute(‘disabled‘,‘disabled‘);
        }else{
            input.addEventListener(‘change‘,readFile,false);
        }
        function readFile(){
            var files = this.files;
            var liLength= $("#commentImgList li.li-img").length;
            var count = files.length>6-liLength ? 6-liLength : files.length;
            CommentDetail.everyUploadCount = count;
            CommentDetail.layerLoadingIndex = layer.open({
                type: 2
                ,content: ‘加载中‘
                ,shadeClose:false
            });
            for(var i=0;i<count;i++){
                if (!input[‘value‘].match(/.jpg|.gif|.png|.bmp/i)){
                    return alert("上传的图片格式不正确,请重新选择")
                }
                var item = files[i];
                (function(img) {
                    var mpImg = new MegaPixImage(img);
                    var resImg = document.createElement("img");
                    var items = item;
                    resImg.file = img;
                    mpImg.render(resImg, { maxWidth: 1280, maxHeight: 960, quality: 1 }, function() {
                        var wdh = Number(resImg.width)>Number(resImg.height)? true : false;
                        var commentListLiHeight = Number((window.screen.width)*0.92*0.3).toFixed(1);
                        if(wdh){
                            var htmlStr = ‘<li class="li-img"><a style="height: ‘+commentListLiHeight+‘px" href="javascript:;"><img src="‘+resImg.src+‘" class="dataImg" onclick="CommentDetail.initSwiper(this)" style="width: 100%;"></a><i class="icon-del" onclick="CommentDetail.delImage(this,\‘‘+items.name+‘\‘)"></i></li>‘
                        }else{
                            var htmlStr = ‘<li class="li-img"><a style="height: ‘+commentListLiHeight+‘px" href="javascript:;"><img src="‘+resImg.src+‘" class="dataImg" onclick="CommentDetail.initSwiper(this)" style="height: 100%;"></a><i class="icon-del" onclick="CommentDetail.delImage(this,\‘‘+items.name+‘\‘)"></i></li>‘
                        }
                        $("#commentImgList").prepend(htmlStr);
                        CommentDetail.uploadShowHide();
                        CommentDetail.fileUpload(resImg.src, item.type,items.name);
                    });
                })(item);
            }
        }
    },
    fileUpload: function(data,type,name) {
        var opts = {
            ‘file‘:name.slice(0,name.lastIndexOf(‘.‘)),
            ‘url‘:"/js/ueditor/jsp/uploader.jsp?action=uploaduser&dirName=comment&needCompress=true"
        };
        if(type.indexOf(‘jpeg‘)>-1) type=‘image/jpg‘;
        var text = window.atob(data.split(‘,‘)[1]);
        var ia = new Uint8Array(text.length);
        for (var i = 0; i < data.length; i++) {
            ia[i] = text.charCodeAt(i);
        };

        var Builder = window.WebKitBlobBuilder || window.MozBlobBuilder;
        var blob;

        if (Builder) {
            var builder = new Builder();
            builder.append(ia);
            blob = builder.getBlob(type);
        } else {
            blob = new window.Blob([ia], {type: type});
        }
        var fd = new FormData();
        fd.append(opts.file, blob);
        var xhr = new XMLHttpRequest();
        xhr.addEventListener("load", opts.success, false);
        xhr.addEventListener("error", opts.error, false);
        xhr.open("POST", opts.url);
        xhr.send(fd);
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && xhr.status == 200) {
                CommentDetail.everyUploadCount--;
                var ret = JSON.parse(xhr.responseText);
                console.log(ret);
                console.log(ret.state);
                if(ret.state==‘SUCCESS‘){
                    CommentDetail.uploadImg.push({"original":ret.original,"savepath":ret.savepath});
                }

                if(CommentDetail.everyUploadCount==0){
                    layer.close(CommentDetail.layerLoadingIndex);
                }
            }
        };
    },
    delImage : function(obj,name){
        console.log(‘删除前:‘,CommentDetail.uploadImg)
        for(var i=0;i<CommentDetail.uploadImg.length;i++){
            var original = CommentDetail.uploadImg[i].original.slice(0,CommentDetail.uploadImg[i].original.lastIndexOf(‘.‘));
            var delName = name.slice(0,name.lastIndexOf(‘.‘));
            if(original == delName){
                CommentDetail.uploadImg.splice(i,1);
            }
        }
        console.log(‘删除后:‘,CommentDetail.uploadImg)
        $(obj).parents(‘li‘).remove();
        CommentDetail.uploadShowHide();
    },
    initSwiper : function (obj) {
        var img = $("#commentImgList").find(‘.li-img‘).find(‘img‘);
        var index = $(obj).parents(‘li.li-img‘).index();
        var html = ‘‘;
        html += ‘<div class="swiper-container swiper-container-comment" id="swiperContainer" style="display:block;"><div class="swiper-wrapper">‘;
        for(var i=0;i<img.length;i++){
            html += ‘<div class="swiper-slide ui-flex justify-center center">‘ +
                ‘<img src="‘+img[i].src+‘" onclick="CommentDetail.closeSwiper()">‘ +
                ‘</div>‘;
        }
        html += ‘</div><div class="swiper-pagination"></div></div>‘;
        $(‘body‘).append(html);
        new Swiper (‘#swiperContainer‘, {
            loop: true,
            initialSlide:index,
            pagination: ‘.swiper-pagination‘,
            paginationType : ‘fraction‘
        })
    },
    closeSwiper : function () {
        $("#swiperContainer").remove();
    },
};

$(function () {
    CommentDetail.submitComment({obj:$("#btnSubmitComment")});
    CommentDetail.imgFileUpload()
});

B、HTML

 <ul class="list" id="commentImgList" data-pswp-uid="1">
     <li class="li-file">
         <img src="images/input-file-default.png"  style="width:100%;">
         <input type="file" class="img-file" id="imgFileUpload"  multiple/>
     </li>
 </ul>
 <a href="javascript:;" class="btn-submit" id="btnSubmitComment">提交</a>

C、megapix-image.js (https://github.com/stomita/ios-imagefile-megapixel)

/**
 * Mega pixel image rendering library for ios6 Safari
 *
 * Fixes iOS6 Safari‘s image file rendering issue for large size image (over mega-pixel),
 * which causes unexpected subsampling when drawing it in canvas.
 * By using this library, you can safely render the image with proper stretching.
 *
 * Copyright (c) 2012 Shinichi Tomita <[email protected]>
 * Released under the MIT license
 */
(function() {

  /**
   * Detect subsampling in loaded image.
   * In iOS, larger images than 2M pixels may be subsampled in rendering.
   */
  function detectSubsampling(img) {
    var iw = img.naturalWidth, ih = img.naturalHeight;
    if (iw * ih > 1024 * 1024) { // subsampling may happen over megapixel image
      var canvas = document.createElement(‘canvas‘);
      canvas.width = canvas.height = 1;
      var ctx = canvas.getContext(‘2d‘);
      ctx.drawImage(img, -iw + 1, 0);
      // subsampled image becomes half smaller in rendering size.
      // check alpha channel value to confirm image is covering edge pixel or not.
      // if alpha value is 0 image is not covering, hence subsampled.
      return ctx.getImageData(0, 0, 1, 1).data[3] === 0;
    } else {
      return false;
    }
  }

  /**
   * Detecting vertical squash in loaded image.
   * Fixes a bug which squash image vertically while drawing into canvas for some images.
   */
  function detectVerticalSquash(img, iw, ih) {
    var canvas = document.createElement(‘canvas‘);
    canvas.width = 1;
    canvas.height = ih;
    var ctx = canvas.getContext(‘2d‘);
    ctx.drawImage(img, 0, 0);
    var data = ctx.getImageData(0, 0, 1, ih).data;
    // search image edge pixel position in case it is squashed vertically.
    var sy = 0;
    var ey = ih;
    var py = ih;
    while (py > sy) {
      var alpha = data[(py - 1) * 4 + 3];
      if (alpha === 0) {
        ey = py;
      } else {
        sy = py;
      }
      py = (ey + sy) >> 1;
    }
    var ratio = (py / ih);
    return (ratio===0)?1:ratio;
  }

  /**
   * Rendering image element (with resizing) and get its data URL
   */
  function renderImageToDataURL(img, options, doSquash) {
    var canvas = document.createElement(‘canvas‘);
    renderImageToCanvas(img, canvas, options, doSquash);
    return canvas.toDataURL("image/jpeg", options.quality || 0.8);
  }

  /**
   * Rendering image element (with resizing) into the canvas element
   */
  function renderImageToCanvas(img, canvas, options, doSquash) {
    var iw = img.naturalWidth, ih = img.naturalHeight;
    if (!(iw+ih)) return;
    var width = options.width, height = options.height;
    var ctx = canvas.getContext(‘2d‘);
    ctx.save();
    transformCoordinate(canvas, ctx, width, height, options.orientation);
    var subsampled = detectSubsampling(img);
    if (subsampled) {
      iw /= 2;
      ih /= 2;
    }
    var d = 1024; // size of tiling canvas
    var tmpCanvas = document.createElement(‘canvas‘);
    tmpCanvas.width = tmpCanvas.height = d;
    var tmpCtx = tmpCanvas.getContext(‘2d‘);
    var vertSquashRatio = doSquash ? detectVerticalSquash(img, iw, ih) : 1;
    var dw = Math.ceil(d * width / iw);
    var dh = Math.ceil(d * height / ih / vertSquashRatio);
    var sy = 0;
    var dy = 0;
    while (sy < ih) {
      var sx = 0;
      var dx = 0;
      while (sx < iw) {
        tmpCtx.clearRect(0, 0, d, d);
        tmpCtx.drawImage(img, -sx, -sy);
        ctx.drawImage(tmpCanvas, 0, 0, d, d, dx, dy, dw, dh);
        sx += d;
        dx += dw;
      }
      sy += d;
      dy += dh;
    }
    ctx.restore();
    tmpCanvas = tmpCtx = null;
  }

  /**
   * Transform canvas coordination according to specified frame size and orientation
   * Orientation value is from EXIF tag
   */
  function transformCoordinate(canvas, ctx, width, height, orientation) {
    switch (orientation) {
      case 5:
      case 6:
      case 7:
      case 8:
        canvas.width = height;
        canvas.height = width;
        break;
      default:
        canvas.width = width;
        canvas.height = height;
    }
    switch (orientation) {
      case 2:
        // horizontal flip
        ctx.translate(width, 0);
        ctx.scale(-1, 1);
        break;
      case 3:
        // 180 rotate left
        ctx.translate(width, height);
        ctx.rotate(Math.PI);
        break;
      case 4:
        // vertical flip
        ctx.translate(0, height);
        ctx.scale(1, -1);
        break;
      case 5:
        // vertical flip + 90 rotate right
        ctx.rotate(0.5 * Math.PI);
        ctx.scale(1, -1);
        break;
      case 6:
        // 90 rotate right
        ctx.rotate(0.5 * Math.PI);
        ctx.translate(0, -height);
        break;
      case 7:
        // horizontal flip + 90 rotate right
        ctx.rotate(0.5 * Math.PI);
        ctx.translate(width, -height);
        ctx.scale(-1, 1);
        break;
      case 8:
        // 90 rotate left
        ctx.rotate(-0.5 * Math.PI);
        ctx.translate(-width, 0);
        break;
      default:
        break;
    }
  }

  var URL = window.URL && window.URL.createObjectURL ? window.URL :
            window.webkitURL && window.webkitURL.createObjectURL ? window.webkitURL :
            null;

  /**
   * MegaPixImage class
   */
  function MegaPixImage(srcImage) {
    if (window.Blob && srcImage instanceof Blob) {
      if (!URL) { throw Error("No createObjectURL function found to create blob url"); }
      var img = new Image();
      img.src = URL.createObjectURL(srcImage);
      this.blob = srcImage;
      srcImage = img;
    }
    if (!srcImage.naturalWidth && !srcImage.naturalHeight) {
      var _this = this;
      srcImage.onload = srcImage.onerror = function() {
        var listeners = _this.imageLoadListeners;
        if (listeners) {
          _this.imageLoadListeners = null;
          for (var i=0, len=listeners.length; i<len; i++) {
            listeners[i]();
          }
        }
      };
      this.imageLoadListeners = [];
    }
    this.srcImage = srcImage;
  }

  /**
   * Rendering megapix image into specified target element
   */
  MegaPixImage.prototype.render = function(target, options, callback) {
    if (this.imageLoadListeners) {
      var _this = this;
      this.imageLoadListeners.push(function() { _this.render(target, options, callback); });
      return;
    }
    options = options || {};
    var imgWidth = this.srcImage.naturalWidth, imgHeight = this.srcImage.naturalHeight,
        width = options.width, height = options.height,
        maxWidth = options.maxWidth, maxHeight = options.maxHeight,
        doSquash = !this.blob || this.blob.type === ‘image/jpeg‘;
    if (width && !height) {
      height = (imgHeight * width / imgWidth) << 0;
    } else if (height && !width) {
      width = (imgWidth * height / imgHeight) << 0;
    } else {
      width = imgWidth;
      height = imgHeight;
    }
    if (maxWidth && width > maxWidth) {
      width = maxWidth;
      height = (imgHeight * width / imgWidth) << 0;
    }
    if (maxHeight && height > maxHeight) {
      height = maxHeight;
      width = (imgWidth * height / imgHeight) << 0;
    }
    var opt = { width : width, height : height };
    for (var k in options) opt[k] = options[k];

    var tagName = target.tagName.toLowerCase();
    if (tagName === ‘img‘) {
      target.src = renderImageToDataURL(this.srcImage, opt, doSquash);
    } else if (tagName === ‘canvas‘) {
      renderImageToCanvas(this.srcImage, target, opt, doSquash);
    }
    if (typeof this.onrender === ‘function‘) {
      this.onrender(target);
    }
    if (callback) {
      callback();
    }
    if (this.blob) {
      this.blob = null;
      URL.revokeObjectURL(this.srcImage.src);
    }
  };

  /**
   * Export class to global
   */
  if (typeof define === ‘function‘ && define.amd) {
    define([], function() { return MegaPixImage; }); // for AMD loader
  } else if (typeof exports === ‘object‘) {
    module.exports = MegaPixImage; // for CommonJS
  } else {
    this.MegaPixImage = MegaPixImage;
  }

})();

 

以上是关于h5 端图片上传-模拟多张上传的主要内容,如果未能解决你的问题,请参考以下文章

js-jssdk微信H5选择多张图片预览并上传(兼容ios,安卓,已测试)

多张图片上传功能java后端代码实现,并返回访问的图片的url

h5移动端实现图片文件上传

h5移动端实现图片文件上传

uniapp怎么实现选择和上传图片分开

H5+jqweui实现手机端图片压缩上传