显示多文件上传 Jquery/Ajax 的进度
Posted
技术标签:
【中文标题】显示多文件上传 Jquery/Ajax 的进度【英文标题】:Show a progress on multiple file upload Jquery/Ajax 【发布时间】:2014-06-06 19:04:36 【问题描述】:我有允许用户上传多个文件的上传表单。我决定如果文件很大,进度条会很好。下面是我的源代码。我是 jquery 的新手,通常我只会使用 php,但我发现 ajax 对用户更友好。
<div id="new_upload">
<div class="close_btn"></div>
<div id="uploads"></div>
<form action="global.func/file_upload.php" method="post" enctype="multipart/form-data" id="upload_file">
<fieldset><legend>Upload an image or video</legend>
<input type="file" id="file" name="file[]" placeholder="Upload Image or Video" multiple /><input type="submit" value="upload file" id="upload_file_btn" required />
</fieldset>
<div class="bar">
<div class="bar_fill" id="pb">
<div class="bar_fill_text" id="pt"></div>
</div>
</div>
</form>
</div>
<script>
function OnProgress(event, position, total, percentComplete)
//Progress bar
console.log(total);
$('#pb').width(percentComplete + '%') //update progressbar percent complete
$('#pt').html(percentComplete + '%'); //update status text
function beforeSubmit()
console.log('ajax start');
function afterSuccess(data)
console.log(data);
$(document).ready(function(e)
$('#upload_file').submit(function(event)
event.preventDefault();
var filedata = document.getElementById("file");
formdata = new FormData();
var i = 0, len = filedata.files.length, file;
for (i; i < len; i++)
file = filedata.files[i];
formdata.append("file[]", file);
formdata.append("json",true);
$.ajax(
url: "global.func/file_upload.php",
type: "POST",
data: formdata,
processData: false,
contentType: false,
dataType:"JSON",
xhr: function()
var myXhr = $.ajaxSettings.xhr();
return myXhr;
,
beforeSubmit: beforeSubmit,
uploadProgress:OnProgress,
success: afterSuccess,
resetForm: true
);
);
);
</script>
图片上传工作正常,数组发送到 ajax 但进度条没有移动。事实上,调用需要产生这个的两个函数的console.log 也不会出现。有没有正确的方法来调用我的 ajax 请求中的函数,以使这个进度条工作。
beforeSubmit: beforeSubmit, 上传进度:OnProgress, 成功:afterSuccess,
请注意,当控制台显示我的数据时,此功能“成功:afterSuccess”正在工作。
【问题讨论】:
您为什么不检查 Eskinder 的回答?对我来说它似乎更完整。 【参考方案1】:这是你的 HTML 表单
<form method="post" action="uploadImages.php" name ='photo' id='imageuploadform' enctype="multipart/form-data">
<input hidden="true" id="fileupload" type="file" name="image[]" multiple >
<div id ="divleft">
<button id="btnupload"></button>
</div>
</form>
这是你的 JQuery 和 ajax。 默认情况下,fileInput 是隐藏的。
点击上传按钮
$("#btnupload").click(function(e)
$("#fileupload").click();
e.preventDefault();
);
$('#fileupload').change(function (e)
$("#imageuploadform").submit();
e.preventDefault();
);
$('#imageuploadform').submit(function(e)
var formData = new FormData(this);
$.ajax(
type:'POST',
url: 'ajax/uploadImages',
data:formData,
xhr: function()
var myXhr = $.ajaxSettings.xhr();
if(myXhr.upload)
myXhr.upload.addEventListener('progress',progress, false);
return myXhr;
,
cache:false,
contentType: false,
processData: false,
success:function(data)
console.log(data);
alert('data returned successfully');
,
error: function(data)
console.log(data);
);
e.preventDefault();
);
function progress(e)
if(e.lengthComputable)
var max = e.total;
var current = e.loaded;
var Percentage = (current * 100)/max;
console.log(Percentage);
if(Percentage >= 100)
// process completed
您的 php 代码如下所示
<?php
header('Content-Type: application/json');
$valid_exts = array('jpeg', 'jpg', 'png', 'gif'); // valid extensions
$max_size = 30000 * 1024; // max file size in bytes
$json = array();
if ( $_SERVER['REQUEST_METHOD'] === 'POST' )
for($i=0;$i<count($_FILES['image']['tmp_name']);$i++)
$path="image/uploads/photos/";
if(is_uploaded_file($_FILES['image']['tmp_name'][$i]) )
// get uploaded file extension
$ext = strtolower(pathinfo($_FILES['image']['name'][$i], PATHINFO_EXTENSION));
// looking for format and size validity
if (in_array($ext, $valid_exts) AND $_FILES['image']['size'][$i] < $max_size)
// unique file path
$uid = uniqid();
$date = date('Y-m-d-H-i-s');
$path = $path ."image_" .$date. '_' . $uid . "." .$ext;
$returnJson[]= array("filepath"=>$path);
$filename = "image_" . $date . "_" .$uid . "." . $ext;
$this->createthumb($i,$filename);
// move uploaded file from temp to uploads directory
if (move_uploaded_file($_FILES['image']['tmp_name'][$i], $path))
//$status = 'Image successfully uploaded!';
//perform sql updates here
else
$status = 'Upload Fail: Unknown error occurred!';
else
$status = 'Upload Fail: Unsupported file format or It is too large to upload!';
else
$status = 'Upload Fail: File not uploaded!';
else
$status = 'Bad request!';
echo json_encode($json);
?>
【讨论】:
在测试这个本地主机时,我只得到了 100% 的事件。本地上传自然是极快的。限制网络以查看增量事件。 与@Gunslinger 相同,但我正在发送到远程服务器。使用 5MB 或更大的文件调用会立即按预期进行。但是,使用 2MB 左右的小(呃)文件永远不会调用进度。大约有 10 秒的延迟,然后用 100 调用进度... 当然,本地上传时是这样的。【参考方案2】:您必须使用自定义 XMLHttpRequest 才能通过 AJAX 和 jQuery 执行此操作。这里有一个例子:How can I upload files asynchronously?
【讨论】:
是 xhr: function() 而不是 uploadprogress 来处理这个问题,谢谢以上是关于显示多文件上传 Jquery/Ajax 的进度的主要内容,如果未能解决你的问题,请参考以下文章
使用 jQuery $.ajax 和 Spring Boot 上传图片的进度条
带有进度条的 jQuery ajax 上传 - 没有 flash