关于JQuery上传图片input file change 事件只触发一次问题:
$(document).on('change onpropertychange',"#imgUrl", function() { //文件上传
var file = this.files[0];
console.log(file);
if((file.size / 1024).toFixed(0)>300){
$.alert({
title: '提示!',
content: "图片大小为:"+(file.size / 1024).toFixed(0)+"kb,要求不能大于300kb",
confirm: function(){
}
});
return;
};
//读取图片数据
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
//加载图片获取图片真实宽度和高度
var image = new Image();
image.onload=function(){
var width = image.width;
var height = image.height;
if(width=="590"&&height=="824"){
postFile();
$('#imgUrl').replaceWith('<input id="imgUrl" class="postfile" type="file" multiple="multiple">');
}else{
$.alert({
title: '提示!',
content: "图片宽高不符合590*824!",
confirm: function(){
}
});
$('#imgUrl').replaceWith('<input id="imgUrl" class="postfile" type="file" multiple="multiple">');
}
};
image.src= data;
};
reader.readAsDataURL(file);
});
复制代码
$(document).on('change onpropertychange', "#postfile",function() { //这里要用事件委派b
$(".poststate").text("请选择上传以.txt后缀结尾的文本文件!").css("color", "blue");
postFile();
$('#postfile').replaceWith('<input id="postfile" type="file" accept="text/plain" multiple="multiple" />');
});
复制代码
function postFile() { //判断是否有选择上传文件
var imgPath = $("#postfile").val();
if(imgPath == "") {
$(".poststate").text("请选择上传的文本文件,以.txt后缀结尾!").css("color", "blue");
return;
}
var strExtension = imgPath.substr(imgPath.lastIndexOf('.') + 1); //判断上传文件的后缀名
if(strExtension != 'txt') {
$(".poststate").text("请选择上传的文本文件,以.txt后缀结尾!").css("color", "blue");
return;
}
var formData = new FormData();
formData.append("file", $("#postfile")[0].files[0]);
//console.log(postfile.files[0]);
$.ajax({
contentType: "multipart/form-data",
url: "xxxx/xxxxx/xx",
type: "POST",
data: formData,
dataType: "text",
processData: false,
contentType: false,
cache: false,
beforeSend: function() {
$(".poststate").text("正在努力上传中,请稍后!").css("color", "blue");
},
success: function(data) {
var reObj = JSON.parse(data);
if(reObj.status=="0"){
if(reObj.content) {
$.alert({
title: '提示:',
backgroundDismiss: true,
content: '上传文件成功!'
});
$(".poststate").text('"' + reObj.content.fileName + '"' + "上传成功!").css("color", "blue");
PostObj.pubS3FileUrl = reObj.content.url;
}else {
$.alert({
title: '提示:',
backgroundDismiss: true,
content: reObj.message
});
$(".poststate").text("");
}
}else{
PostObj.pubS3FileUrl="";
$.alert({
title: '提示:',
backgroundDismiss: true,
content: reObj.message
});
$(".poststate").text(reObj.message);
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
$(".poststate").text("上传失败,请检查网络后重试!").css("color", "red");;
}
});
}
复制代码
用来把文件读入内存,并且读取文件中的数据。FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据。到目前文职,只有FF3.6+和Chrome6.0+实现了FileReader接口。
1、FileReader接口的方法
FileReader接口有4个方法,其中3个用来读取文件,另一个用来中断读取。无论读取成功或失败,方法并不会返回读取结果,这一结果存储在result属性中。
方法名 参数描述
readAsBinaryStringfile将文件读取为二进制编码
readAsTextfile,[encoding]将文件读取为文本
readAsDataURLfile将文件读取为DataURL
abort(none)终端读取操作
2、FileReader接口事件
FileReader接口包含了一套完整的事件模型,用于捕获读取文件时的状态。
事件描述
onabort中断
onerror出错
onloadstart开始
onprogress正在读取
onload成功读取
onloadend读取完成,无论成功失败
上传图片预览:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
* {
padding: 0;
margin: 0;
}
.container {
width: 800px;
margin: 100px auto;
}
.imgs {
width: 300px;
height: 300px;
}
.imgs img {
width: 100%;
}
</style>
</head>
<body>
<div class="container">
<input type="file" name="file" id="file" value="上传" />
<div class="imgs">
<img id="preImg" src="" />
</div>
<div class="imgs">
<img id="preImg1" src="" />
</div>
<div class="imgs">
<img id="preImg2" src="" />
</div>
<div class="imgs">
<img id="preImg3" src="" />
</div>
</div>
<script type="text/javascript">
var fe = document.getElementById("file");
var img = document.getElementById("preImg");
var img1 = document.getElementById("preImg1");
var img2 = document.getElementById("preImg2");
var img3 = document.getElementById("preImg3");
fe.onchange = function() {
var reader = new FileReader();
var _file = this.files[0];
console.log("reader");
console.log(reader);
// 建议去输出下这3个东西 仔细看看就明白了
console.log("this.files");
console.log(this.files);
console.log("_file");
console.log(_file);
reader.readAsDataURL(_file); //这个是很重要的一步 讲读取到的文件编码成DataURL 否则不能用
console.log("reader");
console.log(reader);
reader.onload = function() {
img.setAttribute('src', this.result);
};
}
</script>
</body>
</html>
复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
var result = document.getElementById("result");
var file = document.getElementById("file");
//判断浏览器是否支持FileReader接口
if(typeof FileReader == 'undefined') {
result.InnerHTML = "<p>你的浏览器不支持FileReader接口!</p>";
//使选择控件不可操作
file.setAttribute("disabled", "disabled");
}
function readAsDataURL() {
//检验是否为图像文件
var file = document.getElementById("file").files[0];
if(!/image\/\w+/.test(file.type)) {
alert("看清楚,这个需要图片!");
return false;
}
var reader = new FileReader();
//将文件以Data URL形式读入页面
reader.readAsDataURL(file);
reader.onload = function(e) {
var result = document.getElementById("result");
//显示文件
result.innerHTML = '<img src="" alt="" />';
}
}
function readAsBinaryString() {
var file = document.getElementById("file").files[0];
var reader = new FileReader();
//将文件以二进制形式读入页面
reader.readAsBinaryString(file);
reader.onload = function(f) {
var result = document.getElementById("result");
//显示文件
result.innerHTML = this.result;
}
}
function readAsText() {
var file = document.getElementById("file").files[0];
var reader = new FileReader();
//将文件以文本形式读入页面
reader.readAsText(file);
reader.onload = function(f) {
var result = document.getElementById("result");
//显示文件
result.innerHTML = this.result;
}
}
</script>
<p>
<label>请选择一个文件:</label>
<input type="file" id="file" />
<input type="button" value="读取图像" onclick="readAsDataURL()" />
<input type="button" value="读取二进制数据" onclick="readAsBinaryString()" />
<input type="button" value="读取文本文件" onclick="readAsText()" />
</p>
<div id="result" name="result"></div>
</body>
</html>复制代码
上传文件预览:
准备上传
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>文件上传</title>
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.2.0/css/bootstrap.min.css">
<script src=""></script>
<style>
body,
html {
margin: 0 auto;
}
.up-header {
width: 600px;
text-align: center;
}
.up-content {
min-height: 200px;
border: 1px solid #CCCCCC;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: #FAFAFA;
color: #999;
font-size: 20px;
text-align: center;
}
.up-area {
border: 2px dashed #ccc;
margin: 10px 20px 20px 20px;
width: 300px;
min-height: 200px;
line-height: 100px;
background-color: #fff;
}
.list-group {
margin: 0px auto;
;
width: 200px;
min-height: 100px;
padding: 10px;
}
img {
max-width: 100%;
}
.btn {}
.close {
margin-left: 550px;
margin-top: -20px;
}
</style>
</head>
<body>
<header id="header" class="page-header">
<!-- 头部显示 -->
<div class="container upload ">
<div class="up-header center-block">
<h2>文件上传——两种形式</h2>
<div class="input-group" style="width:600px; display:flex;">
<input type="text" class="form-control" placeholder="在此处粘贴图片网址">
<button type="button" class="btn btn-primary">上传图片</button>
</div>
</div>
<div class="row">
<!-- 拖拽图片到这来 -->
<div class="col-md-5 col-md-offset-1 up-content dragFile">
<p style="margin-top:10px;">拖拽图片到这里哟</p>
<div class="up-area">
<input type="file" style="display:none;" id="fileDrag" name="fileDragselect" multiple>
<div class="row">
<ul class="list-group clearfix list-drag">
</ul>
</div>
</div>
</div>
<!-- 点击按钮上传文件 -->
<div class="col-md-5 up-content btnFile">
<div class="btn">
<button type="button" class="btn btn-success" id="btn"> 本地上传文件</button>
<input type="file" style="display:none;" id="fileInput" name="fileselect" multiple>
</div>
<div class="up-area">
<div class="row">
<ul class="list-group clearfix list-btn">
</ul>
</div>
</div>
</div>
</div>
</div>
</header>
<script type="text/javascript">
//点击本地上传文件
$('#btn').click(() => {
$('#fileInput').click();
})
$('#fileInput').change((event) => {
var files = event.target.files;
appendFile(files, '.list-btn');
})
//拖拽上传文件 在页面进行预览 上传form用到ajax
const dragbox = document.querySelector('.dragFile');
dragbox.addEventListener('dragover', function(e) {
e.preventDefault(); // 必须阻止默认事件
}, false);
dragbox.addEventListener('drop', function(e) {
e.preventDefault(); // 阻止默认事件
var files = e.dataTransfer.files; //获取文件
appendFile(files, '.list-drag')
// code
}, false);
function appendFile(files, listName) {
for(file of files) {
let url = window.URL.createObjectURL(file);
let liStr = `
<li class="list-group-item">
<div>
<img src="" alt="文件" />
</div>
</li>
`;
$(listName).append(liStr);
}
}
</script>
</body>
</html>复制代码