如何在ajax post中获取文件上传的状态

Posted

技术标签:

【中文标题】如何在ajax post中获取文件上传的状态【英文标题】:how to get the status of file upload in ajax post 【发布时间】:2014-06-19 10:42:04 【问题描述】:

当用户使用ajax调用上传多个文件点击取消如何获取上传文件的状态。

这样我调用ajax请求上传文件:

 var request = $.ajax(
     url: 'files.php',
     type: 'POST',
     data: data,
     cache: false,
     contentType: false,
     processData: false,
     beforeSend: function () 
         $(".progressbar").show();
     ,
     xhr: function () 
         var xhr = $.ajaxSettings.xhr();
         if (xhr.upload) 
             xhr.upload.addEventListener('progress', showProgress, false);
         
         return xhr;
     ,
     success: function (data) 
         if (percentComplete <= 100) 
             $('#pb div').animate(
                 width: '100%'
             , 
                 step: function (now) 
                     $(this).text(Math.round(now) + '%');
                 ,
                 duration: 10
             );
         
         $('#uplcomp').append(data);
     
 );

如果用户点击取消按钮,我会这样做:

request.abort();

由于上面的语句只是中止了ajax请求,我没有得到任何响应,比如上传了多少文件,上传了多少mb等等......

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

我认为您的问题没有默认方式。您正在寻找的信息 - 上传了多少文件 - 我的知识并未存储在 XMLHttpRequest 对象中。

我想(但从未尝试过)您可以为它创建一些自定义。 高级分析:跟踪您的上传进度服务器端。在您的数据库中存储有关上传的一些信息:要处理的文件数量、处理的文件数量、日期/时间、唯一的上传/会话 ID。当您中止上传或上传失败时,您可以根据唯一 ID 通过 ajax 从您的数据库中检索有关上传过程的信息,并将其显示在 UI 中。

注意:如果请求已经发送到服务器,那么即使我们中止请求,服务器也会处理请求,但客户端不会等待/处理响应。

希望这会有所帮助。

【讨论】:

这里是否可以不使用 db... 至少可以使用 xhr 显示当前上传的文件吗? +1 让我清楚上传的文件存储在 XMLHttpRequest 中 如果不使用数据库,我看不到合适的解决方案。信息需要存储在某个地方,以便您稍后可以检索它。显示当前上传的文件:我认为最简单的方法是为每个需要上传的文件执行单独的 ajax 请求。通过这种方式,您可以在客户端知道您正在(不)工作的文件。因此,您可以轻松地在 UI 中呈现处理信息。考虑使用为您完成此类工作的现有上传脚本。我经常使用Dropzone.js,它显示了很多关于上传的信息。 我不想使用任何我不喜欢的第 3 方脚本......并且由于安全问题,我正在发出单个 ajax 请求。因为我的代码中有一些小错误。那么在一个 ajax 请求中我们可以做到这一点吗?如果可能的话,我怎样才能显示当前上传的文件名 我没有看到它在单个请求中工作并显示当前上传文件的信息。您必须逐个发送它们以显示信息,而不是一次发送所有文件。安全工作在这里是题外话。您应该使用 HTTPS 来加密您的数据。如果 1 个调用不安全,那么多个调用也将不安全。最后是一样的:用户将发送 1 个带有多个文件的请求,或者将使用 1 个文件发出多个请求。这不是安全工作的问题,而是客户端性能的问题。不过这不是问题,现在大多数客户端机器都是高端设备

以上是关于如何在ajax post中获取文件上传的状态的主要内容,如果未能解决你的问题,请参考以下文章

在没有 AJAX 的情况下获取文件上传状态

java的servlet里如何获取jsp页面上用ajax传过来的文件?

如何向 ajax 文件上传添加额外的 POST 参数?

如何从 Django 视图中获取价值到 Ajax 成功函数中

能用ajax以POST实现文件上传吗

form表单如何取得返回值