You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.5 KiB
72 lines
1.5 KiB
import {
|
|
hasOwn
|
|
} from 'uni-shared'
|
|
|
|
/**
|
|
* 暂存的文件对象
|
|
*/
|
|
const files = {}
|
|
/**
|
|
* 从url读取File
|
|
* @param {string} url
|
|
* @param {Promise}
|
|
*/
|
|
export 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}
|
|
*/
|
|
export 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)
|
|
}
|
|
var filename = `${Date.now()}.${type.split('/')[1]}`
|
|
return new File([array], filename, { type: type })
|
|
}
|
|
/**
|
|
* 从本地file或者blob对象创建url
|
|
* @param {Blob|File} file
|
|
* @return {string}
|
|
*/
|
|
export 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
|
|
}
|
|
|
|
export function revokeObjectURL (url) {
|
|
(window.URL || window.webkitURL).revokeObjectURL(url)
|
|
delete files[url]
|
|
}
|
|
|