首页 > 其他分享 >上传照片方法

上传照片方法

时间:2023-06-01 09:23:17浏览次数:31  
标签:function return url 上传 照片 blob type const 方法

 

// chooseImage.js

function updateElementStyle (element, styles) {
  for (const attrName in styles) {
    element.style[attrName] = styles[attrName]
  }
}
const ALL = '*'
function isWXEnv () {
  const ua = window.navigator.userAgent.toLowerCase()
  if (ua.match(/MicroMessenger/i) && ua.match(/MicroMessenger/i)[0] === 'micromessenger') {
    return true
  } else {
    return false
  }
}

function createInput({ count, sourceType, type, extension }) {
  const inputEl = document.createElement('input')
  inputEl.type = 'file'

  updateElementStyle(inputEl, {
    position: 'absolute',
    visibility: 'hidden',
    'z-index': -999,
    width: 0,
    height: 0,
    top: 0,
    left: 0
  })

  inputEl.accept = extension.map(item => {
    if (type !== ALL) {
      // 剔除.拼接在type后
      return `${type}/${item.replace('.', '')}`
    } else {
      // 在微信环境里,'.jpeg,.png' 会提示没有应用可执行此操作
      if (isWXEnv()) {
        return '.'
      }
      // 在后缀前方加上.
      return item.indexOf('.') === 0 ? item : `.${item}`
    }
  }).join(',')

  if (count > 1) {
    inputEl.multiple = 'multiple'
  }

  // 经过测试,仅能限制只通过相机拍摄,不能限制只允许从相册选择。
  if (sourceType.length === 1 && sourceType[0] === 'camera') {
    inputEl.capture = 'camera'
  }

  return inputEl
}

function hasOwn (obj, key) {
    const hasOwnProperty = Object.prototype.hasOwnProperty
    return hasOwnProperty.call(obj, key)
  }
  const files = {}
  /**
   * 从url读取File
   * @param {string} url
   * @param {Promise}
   */
function urlToFile (url) {
    var file = files[url]
    if (file) {
      return Promise.resolve(file)
    }
    if (/^data:[a-z-]+\/[a-z-]+;base64,/.test(url)) {
      return Promise.resolve(base64ToFile(url))
    }
    return new Promise((resolve, reject) => {
      var xhr = new XMLHttpRequest()
      xhr.open('GET', url, true)
      xhr.responseType = 'blob'
      xhr.onload = function () {
        resolve(this.response)
      }
      xhr.onerror = reject
      xhr.send()
    })
  }
  /**
   * base64转File
   * @param {string} base64
   * @return {File}
   */
function base64ToFile (base64) {
    base64 = base64.split(',')
    var type = base64[0].match(/:(.*?);/)[1]
    var str = atob(base64[1])
    var n = str.length
    var array = new Uint8Array(n)
    while (n--) {
      array[n] = str.charCodeAt(n)
    }
    return blobToFile(array, type)
  }
  /**
   * 简易获取扩展名
   * @param {string} type
   * @return {string}
   */
  function getExtname (type) {
    const extname = type.split('/')[1]
    return extname ? `.${extname}` : ''
  }
  /**
   * 简易获取文件名
   * @param {*} url
   */
function getFileName (url) {
    url = url.split('#')[0].split('?')[0]
    const array = url.split('/')
    return array[array.length - 1]
  }
  
  /**
   * blob转File
   * @param {Blob} blob
   * @param {string} type
   * @return {File}
   */
function blobToFile (blob, type) {
    if (!(blob instanceof File)) {
      type = type || blob.type || ''
      const filename = `${Date.now()}${getExtname(type)}`
      try {
        blob = new File([blob], filename, { type })
      } catch (error) {
        blob = blob instanceof Blob ? blob : new Blob([blob], { type })
        blob.name = blob.name || filename
      }
    }
    return blob
  }
  /**
   * 从本地file或者blob对象创建url
   * @param {Blob|File} file
   * @return {string}
   */
function fileToUrl (file) {
    for (const key in files) {
      if (hasOwn(files, key)) {
        const oldFile = files[key]
        if (oldFile === file) {
          return key
        }
      }
    }
    var url = (window.URL || window.webkitURL).createObjectURL(file)
    files[url] = file
    return url
}
  
function getSameOriginUrl (url) {
    const a = document.createElement('a')
    a.href = url
    if (a.origin === location.origin) {
      return Promise.resolve(url)
    }
    return urlToFile(url).then(fileToUrl)
}
  
function revokeObjectURL (url) {
    (window.URL || window.webkitURL).revokeObjectURL(url)
    delete files[url]
}
 
let imageInput = null
  
function chooseImage ({
    count=1,
    sizeType=['original'],
    sourceType=['camera','album'],
    extension=['jpg','png','jpeg'],
    success
  }) {
    // TODO handle sizeType 尝试通过 canvas 压缩
  
    if (imageInput) {
      document.body.removeChild(imageInput)
      imageInput = null
    }
  
    imageInput = createInput({
      count,
      sourceType,
      extension,
      type: 'image'
    })
    document.body.appendChild(imageInput)
  
    imageInput.addEventListener('change', function (event) {
      const tempFiles = []
      const fileCount = event.target.files.length
      for (let i = 0; i < fileCount; i++) {
        const file = event.target.files[i]
        let filePath
        Object.defineProperty(file, 'path', {
          get () {
            filePath = filePath || fileToUrl(file)
            return filePath
          }
        })
        if (i < count) tempFiles.push(file)
      }
      const res = {
        errMsg: 'chooseImage:ok',
        get tempFilePaths () {
          return tempFiles.map(({ path }) => path)
        },
        tempFiles: tempFiles
      }
      success(res)
      // TODO 用户取消选择时,触发 fail,目前尚未找到合适的方法。
    })
  
    imageInput.click()
  }
  

调用这个方法:

chooseImage({
            success: function (res) {
              let sizeLimit = 5 * 1024 * 1024
              let size = res.tempFiles[0].size
              if (size > sizeLimit) {
                layer.msg(`图片不能大于5M`, { icon: 5, shift: 6 });
                return
              }
              uploadPics[key] = res
              let imgEle = $(that).find('.image-item')
              let iconDelete = $(that).find('.image-item-delete')
              imgEle[0].src = res.tempFilePaths
              imgEle.show()
              iconDelete.show()
              iconDelete.on('click', function (e) {
                e.stopPropagation()
                imgEle.hide()
                iconDelete.hide()
                uploadPics[key] = ''
              })
            }
          })

 

标签:function,return,url,上传,照片,blob,type,const,方法
From: https://www.cnblogs.com/playforkeeps/p/17447956.html

相关文章

  • 启动HBase时提示SLF4J: Class path contains multiple SLF4J bindings的解决方法
    启动hbase报错:“SLF4J:ClasspathcontainsmultipleSLF4Jbindings.”解决方法cd/home/opt/hbase-2.2.3/lib/client-facing-thirdpartymvslf4j-log4j12-1.7.25.jarslf4j-log4j12-1.7.25-copy修改了hbase中的文件名,保留了hadoop的,这个会有问题,一个当启动hbase的reg会报错这......
  • Python判断一个数据结构是否为空的方法
    《EffectivePython》,里面提到判断字符串或者集合是否为空的原则。意思是:不要通过取字符串或者集合的长度来判断是否为空,而是要用not关键字来判断,因为当字符串或集合为空时,其值被隐式地赋为False.test_str=''test_tuple=()test_list=[]test_dict={}test_set=set()ifnot(test......
  • Js 常见数据类型及判断方法及手写深拷贝
    常见值类型:undefined、String、Number、boolean、Symbol.常见 引用类型:Array、Object、function(特殊引用类型,单不用于存储数据,所以 “没有拷贝、复制函数” 这说法)、null(特殊引用类型,指针指向为空地址)判断数据类型的方法:typeof运算符leta;conststring='abc......
  • Razor Pages本地IIS服务器部署流程及部分问题解决方法
     记录一下自己在本地IIS服务器部署的基本流程:添加IIS服务器控制面板>>程序和功能 启用或关闭windows功能>>勾选相关功能   网站部署将项目发布(publish)至本地文件夹:在包含.sln文件的目录下打开终端,输入dotnetpublish-cdebug--no-self-contained......
  • adr 方便的架构决策记录方法
    adr是编译中方便的架构决策记录方法,同时也纳入了技术雷达中,是一个很值得使用的模式包含的内容一般会包含标题,状态,上下文,决策,以及影响,aws官方包含了很不错的例子,值得学习下格式对于存储格式没明确要求,实际上github有一个adr的组织,包含了不少实现工具,很值得参考学习对于开发......
  • JDK 8 新特性:方法引用:静态方法和实例方法
         ......
  • JDK 8 新特性:特定类型方法的引用
         ......
  • m基于FPGA的RGB转ycrcb颜色空间转换算法实现,包含testbench,对比三种转换方法
    1.算法仿真效果vivado2019.2仿真结果如下:其中1为直接乘法公式计算;2为移位法计算;3为分布式计算;2.算法涉及理论知识概要人类获得信息的主要方式是视觉,通常情况下颜色有2种描述方式,一种是RGB色度空间表示,一种是YCbCr色度空间表示。然而,普通的RGB颜色空间对视频的显示存在......
  • m基于FPGA的RGB转ycrcb颜色空间转换算法实现,包含testbench,对比三种转换方法
    1.算法仿真效果vivado2019.2仿真结果如下: 其中1为直接乘法公式计算; 2为移位法计算; 3为分布式计算; 2.算法涉及理论知识概要        人类获得信息的主要方式是视觉,通常情况下颜色有2种描述方式,一种是RGB色度空间表示,一种是YCbCr色度空间表示。然而,普通......
  • 以样本学习方法解决设备故障检测中的标签问题
    文章的主要内容针对这些问题,提出了一种主动领域自适应智能故障检测框架LDE-ADA,该框架利用迁移学习和主动学习相结合的方法来解决标签域扩展问题,从而提高模型的检测性能。同时,提出了一种改进的主动学习查询策略,以准确选择目标域中新增加的健康类别样本来辅助模型训练,解决标签域扩......