【发布时间】:2019-01-27 21:00:21
【问题描述】:
我有一个多文件输入字段:
<input type="file" class="image_file" multiple>
我正在使用 FileReader 在上传图像时显示它们的预览。
我现在还想在上传的每张图片上显示一个进度条。这是我尝试过的:
$('.image_file').change(function() {
var input = $(this);
var files = this.files;
var total = files.length;
var url = input.attr('data-url');
for (var i = 0; i < total; i++) {
var formData = new FormData();
var file = files[i];
formData.append('image_file', file);
var reader = new FileReader();
reader.onload = function(e) {
var container = $('.photos .photo:not(.active):first');
if (container.length) {
container.css('background-image', 'url(' + e.target.result + ')').addClass('active uploading');
}
};
reader.readAsDataURL(file);
$.ajax({
type: 'post',
url: url,
data: formData,
cache: false,
processData: false,
contentType: false,
xhr: function() {
var myXhr = $.ajaxSettings.xhr();
var progressElem = container.find('progress');
if (myXhr.upload) {
myXhr.upload.addEventListener('progress', function(e) {
if (e.lengthComputable) {
progressElem.attr({
value: e.loaded,
max: e.total
});
}
}, false);
}
return myXhr;
},
success: function(result) {
if (result.status == true) {
$('.success-message').show();
}
else {
alert('There was an error uploading your file.);
}
}
});
}
});
我遇到的问题在 xhr 函数的这一行:
var progressElem = container.find('progress');
图像预览出现,但 AJAX 上传不起作用。控制台中也没有显示错误。我认为因为var container 是在reader.onload 函数中设置的,所以xhr 函数无权访问它。
如果我将该 var 移到函数之外,图片上传会正常工作,但只会显示一个图片预览和一个进度条。
有人知道正确的方法吗?
【问题讨论】:
-
先把
var container = $('.photos .photo:not(.active):first');放在onload之外,你不在同一个作用域,ajax检索不到。试试它是否已经解决了你的问题。
标签: javascript ajax