js上传图片并实现预览

js上传图片预览

前端页面

<!--单图上传 start-->
<input type="file" accept="image/*" onchange="uploadImg(event,this)">
<!--单图上传 end-->

<!--多图上传 start-->
<input type="file" multiple accept="image/*" onchange="uploadImg()">
<!--多图上传 end-->

单图片上传js

var URL = window.URL || window.webkitURL || window.mozURL
   /**
   * 上传预览图片
   */
  function uploadImg(file, currentObj) {
    
    if (file.files && file.files[0]) {
      var reader = new FileReader()
      reader.onload = function(evt) {
        file.base64 = evt.target.result
        var formFile = new FormData()
        // 获取当前dom文件属性
        var fileObj =
          currentObj instanceof HTMLElement
            ? currentObj.files[0]
            : $(currentObj)[0].files[0]
        formFile.append('key', uploadFileKey)
        formFile.append('file', fileObj) //加入文件对象
        var data = formFile
        $.ajax({
          url: uploadFileUrl,
          data: data,
          type: 'POST',
          dataType: 'json',
          cache: false, //上传文件无需缓存
          processData: false, //用于对data参数进行序列化处理 这里必须false
          contentType: false, //必须
          success: function(result) {
            console.log(result)
            $(currentObj)
              .siblings('input[type=hidden]')
              .val(result.info.url)
          },
          error: function(err) {
            console.log(err)
          }
        })
        var tmpImg ='<img src="'+URL.createObjectURL(dataURItoBlob(file.base64)) +'" />';
        $(currentObj).siblings('.upload-list').empty().append(tmpImg).addClass('updateImg')
      }
      reader.readAsDataURL(file.files[0])
    }
  }

demo代码

<title>单图上传预览</title>
  <style>
    .preview {
      width: 200px;
      height:200px;
    }
    .preview img {
      width: 100%;
    }
  </style>
</head>
<body>
  <div class="container">
    <input type="file" accept="image/*" onchange="uploadImg(event,this)">
    <div class="preview">

    </div>
  </div>
  <script>
    var URL = window.URL || window.webkitURL || window.mozURL
    function uploadImg(e,dom) {
      var e = event || e
      var fileObj =
          dom instanceof HTMLElement
            ? dom.files[0]
            : $(dom)[0].files[0]
      console.log(e)
      console.log(dom)
      var container = document.querySelector('.preview')
      var img = new Image()
      img.src = URL.createObjectURL(fileObj)
      img.onload = function() {
        container.appendChild(img)
      }

    }
  </script>
 </body>

多图上传js

用vue写的,换成普通方法即可用

等同于

uploadImg:function(e){}   =>  function uploadImg(e){}
 uploadImg: function(e) {
  if(!this.maxImgLength) {
    return
  }
  var _this = this

  var files = e.target.files || e.dataTransfer.files
  var imgArr = []
  for(var i = 0; i < files.length; i++) {
    // fixme: 这里有一个作用域的问题,选择多张图片会只显示最后onload的一张图片
    // 用闭包方法修复
    (function(file){
        // console.log('file', file)
        if(!/^image/.test(file.type)) {
          $.alert('', '必须上传图片格式')
          return
        }
    
        var reader = new FileReader()
        var formData = new FormData()
    
        reader.onload = function() {
          file.base64 = this.result
          formData.append('key', uploadFileKey)
          formData.append('file', file)
          // console.log(formData)
          // $.showLoading('玩命上传中')
          _this.imgPreview.push(URL.createObjectURL(file))
          // console.log('this.preview', _this.imgPreview)
          _this.postFile(formData).then(function(res) {
            // $.hideLoading()
            _this.imgList.push(res.info)
            // console.log(_this.imgList)
          })
        }
        reader.readAsDataURL(file)
    })(file[i])
  }
},
postFile: function(formData) {
  // console.log(formData)
  return new Promise(function(resolve, reject) {
      $.ajax({
        type: "POST",
        url: apiList.ossUpFile,
        processData: false,
        contentType: false,
        data: formData,
        dataType: "json",
        success: function (resp) {
    	  resolve(resp)
        }
      });
  }) 
}

demo代码

待更新

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值