1、createObjectURL
createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。
2、FileReader方法
FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
createObjectURL demo:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>createObjectURL显示上传的图片</title>
<style>
body{ display:flex; line-height:30px;}
.left , .right{ width:50%; padding-left:10px; box-sizing:border-box;}
.left{ min-height:600px; border-right:#f00 dashed 1px;}
input{ display:block; border:#000 solid 1px;}
</style>
</head>
<body>
<div class="left">
<div><strong>原生JS</strong></div>
单选
<input id="oneJs" type="file" accept="image/*" />
<div id="showOneJs" style="min-height:200px;"></div>
可多选
<input id="twoJs" type="file" accept="image/*" multiple />
<div id="showTwoJs"></div>
</div>
<div class="right">
<div><strong>JQ</strong></div>
单选
<input id="oneJq" type="file" accept="image/*" />
<div id="showOneJq" style="min-height:200px;"></div>
可多选
<input id="twoJq" type="file" accept="image/*" multiple />
<div id="showTwoJq"></div>
</div>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript">
function getObjectURL(file){
//console.log(file);
var url = null;
if(window.createObjectURL!=undefined){ // basic
url = window.createObjectURL(file);
}else if(window.URL!=undefined){ // mozilla(firefox)
url = window.URL.createObjectURL(file);
}else if(window.webkitURL!=undefined){ // webkit or chrome
url = window.webkitURL.createObjectURL(file);
}
return url;
}
/****************/
//jq 调用方法
$('#oneJq').on('change',function(){
$('#showOneJq').empty().append('<img style="max-width:200px; max-height:200px;" src="' + getObjectURL(this.files[0]) + '" />');
});
$('#twoJq').on('change',function(){
var This = this;
$('#showTwoJq').empty();
for(var i = 0; i < This.files.length ; i ++){
$('#showTwoJq').append('<img style="max-width:200px; max-height:200px;" src="' + getObjectURL(This.files[i]) + '" />');
}
});
/****************/
//原生JS调用方法
//添加图片元素
function createImg(imgEle , file , parEle){
imgEle.setAttribute('style','max-width:200px;max-height:200px;');
imgEle.setAttribute('src',getObjectURL(file));
document.getElementById(parEle).appendChild(imgEle);
}
document.getElementById('oneJs').addEventListener( 'change' , function(e){
var img = document.createElement('img');
document.getElementById('showOneJs').innerHTML = '';
createImg(img , e.target.files[0] , 'showOneJs');
} , false );
document.getElementById('twoJs').addEventListener( 'change' , function(e){
var img = [];
document.getElementById('showTwoJs').innerHTML = '';
for(var i = 0; i < e.target.files.length ; i ++){
img[i] = document.createElement('img');
createImg(img[i] , e.target.files[i] , 'showTwoJs');
}
} , false );
</script>
</body>
</html>
FileReader demo:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>fileReaderURL显示上传的图片</title>
<style>
body{ display:flex; line-height:30px;}
.left , .right{ width:50%; padding-left:10px; box-sizing:border-box;}
.left{ min-height:600px; border-right:#f00 dashed 1px;}
input{ display:block; border:#000 solid 1px;}
</style>
</head>
<body>
<div class="left">
<div><strong>原生JS</strong></div>
单选
<input id="oneJs" type="file" accept="image/*" />
<div id="showOneJs" style="min-height:200px;"></div>
可多选
<input id="twoJs" type="file" accept="image/*" multiple />
<div id="showTwoJs"></div>
</div>
<div class="right">
<div><strong>JQ</strong></div>
单选
<input id="oneJq" type="file" accept="image/*" />
<div id="showOneJq" style="min-height:200px;"></div>
可多选
<input id="twoJq" type="file" accept="image/*" multiple />
<div id="showTwoJq"></div>
</div>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript">
function getfileReaderURL(file,callback){
//console.log(file);
var url = null;
var reader = new FileReader();
//console.log(reader);
reader.readAsDataURL(file); //将文件以Data URL形式读入页面
//reader.readAsBinaryString(file); //将文件以二进制形式读入页面
//reader.readAsText(file); //将文件以文本形式读入页面
reader.onload=function(e){ //文件读取成功完成时触发
url = reader.result;
//console.log(url);
callback(url);
}
reader.onloadend=function(e){ //读取完成触发,无论成功或失败
}
}
/****************/
//jq 调用方法
$('#oneJq').on('change',function(){
getfileReaderURL(this.files[0],function(url){
$('#showOneJq').empty().append('<img style="max-width:200px; max-height:200px;" src="' + url + '" />');
});
});
$('#twoJq').on('change',function(){
var This = this;
$('#showTwoJq').empty();
for(var i = 0; i < This.files.length ; i ++){
getfileReaderURL(This.files[i],function(url){
$('#showTwoJq').append('<img style="max-width:200px; max-height:200px;" src="' + url + '" />');
});
}
});
/****************/
//原生JS调用方法
//添加图片元素
function createImg(imgEle , file , parEle){
imgEle.setAttribute('style','max-width:200px;max-height:200px;');
getfileReaderURL(file,function(url){
imgEle.setAttribute('src',url);
document.getElementById(parEle).appendChild(imgEle);
});
}
document.getElementById('oneJs').addEventListener( 'change' , function(e){
var img = document.createElement('img');
document.getElementById('showOneJs').innerHTML = '';
createImg(img , e.target.files[0] , 'showOneJs');
} , false );
document.getElementById('twoJs').addEventListener( 'change' , function(e){
var img = [];
document.getElementById('showTwoJs').innerHTML = '';
for(var i = 0; i < e.target.files.length ; i ++){
img[i] = document.createElement('img');
createImg(img[i] , e.target.files[i] , 'showTwoJs');
}
} , false );
</script>
</body>
</html>
createObjectURL && FileReader vue.js demo:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>fileReaderURL显示上传的图片</title>
<style>
[v-cloak]{ display: none;}
body{ display:flex; line-height: 1.6;}
.left , .right{ width:50%; padding-left:10px; box-sizing:border-box;}
.left{ min-height:600px; border-right:#f00 dashed 1px;}
input{ display:block; border:#000 solid 1px;}
.show_img{ min-height: 200px; padding: 10px 0;}
.show_img img{ display: inline-block; width: 100px; height: 200px; margin: 0 5px; object-fit: contain; border: #eee solid 1px;}
</style>
</head>
<body>
<!-- createObjectURL -->
<div id="app-createobjecturl" v-cloak class="left">
<div style="color: red;">-----createObjectURL-----</div>
<div>单选</div>
<input ref="referenceUpload" @change="sendImg" type="file" accept="image/*" />
<div class="show_img">
<img v-if="img" :src="img" >
</div>
<div>可多选</div>
<input ref="referenceUploadMore" @change="sendImgMore" type="file" accept="image/*" multiple />
<div class="show_img">
<img v-if="imgArr.length" v-for="item in imgArr" :src="item" >
</div>
</div>
<!-- FileReader -->
<div id="app-filereader" v-cloak class="right">
<div style="color: red;">-----FileReader-----</div>
<div>单选</div>
<input ref="referenceUpload" @change="sendImg" type="file" accept="image/*" />
<div class="show_img">
<img v-if="img" :src="img" >
</div>
<div>可多选</div>
<input ref="referenceUploadMore" @change="sendImgMore" type="file" accept="image/*" multiple />
<div class="show_img">
<img v-if="imgArr.length" v-for="item in imgArr" :src="item" >
</div>
</div>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script type="text/javascript">
// createObjectURL
function getObjectURL(file, callback) {
//console.log(file);
var url = null;
if (window.createObjectURL != undefined) { // basic
url = window.createObjectURL(file);
} else if (window.URL != undefined) { // mozilla(firefox)
url = window.URL.createObjectURL(file);
} else if (window.webkitURL != undefined) { // webkit or chrome
url = window.webkitURL.createObjectURL(file);
}
callback(url);
}
var VMC = new Vue({
el:"#app-createobjecturl",
data:{
img:'',
imgArr:[],
},
created() {
},
mounted() {
},
watch() {
},
methods:{
// 上传图片-单张
sendImg(e){
// console.log(e.target.files[0]);
if(e.target.files[0]){
if(e.target.files[0].size / 1024 / 1024 > 3){
this.$refs.referenceUpload.value = null;
alert('请上传不超过3M的图片');
return;
}
// 获取base64格式图片中...
getObjectURL(e.target.files[0],(url)=>{
this.$refs.referenceUpload.value = null;
this.img = url;
console.log(this.img);
});
}
},
// 上传图片-多张
sendImgMore(e){
// console.log(e.target.files[0]);
if(e.target.files[0]){
this.imgArr = [];
let maxSizeTips = []
for(var i = 0; i < e.target.files.length ; i ++){
if(e.target.files[i].size / 1024 / 1024 > 3){
maxSizeTips.push(i+1);
}else{
// 获取base64格式图片中...
getObjectURL(e.target.files[i],(url)=>{
this.imgArr.push(url);
console.log(this.imgArr);
});
}
if(i == e.target.files.length - 1){
this.showTips(maxSizeTips);
this.$refs.referenceUploadMore.value = null;
}
}
}
},
// 多张图片上传后,文件大了一次提示
showTips(maxSizeTips){
if(maxSizeTips.length){
alert('第' + maxSizeTips.join('、') + '张图片超过3M');
}
}
}
})
/****************/
// FileReader
function getfileReaderURL(file,callback){
//console.log(file);
var url = null;
var reader = new FileReader();
//console.log(reader);
reader.readAsDataURL(file); //将文件以Data URL形式读入页面
//reader.readAsBinaryString(file); //将文件以二进制形式读入页面
//reader.readAsText(file); //将文件以文本形式读入页面
reader.onload=function(e){ //文件读取成功完成时触发
url = reader.result;
//console.log(url);
callback(url);
}
reader.onloadend=function(e){ //读取完成触发,无论成功或失败
}
}
var VMF = new Vue({
el:"#app-filereader",
data:{
img:'',
imgArr:[],
},
created() {
},
mounted() {
},
watch() {
},
methods:{
// 上传图片-单张
sendImg(e){
// console.log(e.target.files[0]);
if(e.target.files[0]){
if(e.target.files[0].size / 1024 / 1024 > 3){
this.$refs.referenceUpload.value = null;
alert('请上传不超过3M的图片');
return;
}
// 获取base64格式图片中...
getfileReaderURL(e.target.files[0],(url)=>{
this.$refs.referenceUpload.value = null;
this.img = url;
console.log(this.img);
});
}
},
// 上传图片-多张
sendImgMore(e){
// console.log(e.target.files[0]);
if(e.target.files[0]){
this.imgArr = [];
let maxSizeTips = []
for(var i = 0; i < e.target.files.length ; i ++){
if(e.target.files[i].size / 1024 / 1024 > 3){
maxSizeTips.push(i+1);
}else{
// 获取base64格式图片中...
getfileReaderURL(e.target.files[i],(url)=>{
this.imgArr.push(url);
console.log(this.imgArr);
});
}
if(i == e.target.files.length - 1){
this.showTips(maxSizeTips);
this.$refs.referenceUploadMore.value = null;
}
}
}
},
// 多张图片上传后,文件大了一次提示
showTips(maxSizeTips){
if(maxSizeTips.length){
alert('第' + maxSizeTips.join('、') + '张图片超过3M');
}
}
}
})
</script>
</body>
</html>