Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Web API中检查文件下载是否完成_Javascript_Jquery_Asp.net Web Api_Export To Excel - Fatal编程技术网

Javascript 如何在Web API中检查文件下载是否完成

Javascript 如何在Web API中检查文件下载是否完成,javascript,jquery,asp.net-web-api,export-to-excel,Javascript,Jquery,Asp.net Web Api,Export To Excel,我正在处理一个任务,用户可以下载excel格式的数据。 数据是动态生成的(作为通用列表),然后以excel文件的形式写入,这样做非常有效 问题: 我面临的问题是,当数据量很大时,下载文件需要几秒钟的时间。在此期间,我需要向最终用户显示某种进度/指示(比如,下载……消息)。使用当前代码,我无法跟踪文件下载何时完成 这是我的代码 通过web api方法和搜索条件的JS代码 var request = {}; request.Code = codeDdl.find(':selected').val()

我正在处理一个任务,用户可以下载excel格式的数据。 数据是动态生成的(作为通用列表),然后以excel文件的形式写入,这样做非常有效

问题:

我面临的问题是,当数据量很大时,下载文件需要几秒钟的时间。在此期间,我需要向最终用户显示某种进度/指示(比如,下载……消息)。使用当前代码,我无法跟踪文件下载何时完成

这是我的代码

通过web api方法和搜索条件的JS代码

var request = {};
request.Code = codeDdl.find(':selected').val();

$.blockUI({ message: '<h3>Downloading...</h3>' });
//Export to Excel all records
$().largeDownload("api/FileDownload/GetWorkQueueList", {
   'request': JSON.stringify(request)
});
var请求={};
request.Code=codedll.find(':selected').val();
$.blockUI({消息:'下载…});
//将所有记录导出到Excel
$().largeDownload(“api/FileDownload/GetWorkQueueList”{
“请求”:JSON.stringify(请求)
});
读取搜索条件并将其传递给web api方法的JS代码:

(function (d) {
    d.fn.largeDownload = function (a, b, c) { void 0 !== c ? (c = c.toUpperCase(), "GET" != c && (c = "POST")) : c = "POST"; if (void 0 === b || !1 == b) b = d().parse_url(a), a = b.url, b = b.params; var e = d("<form></form"); e.attr("method", c); e.attr("action", a); for (var f in b) a = d("<input />"), a.attr("type", "hidden"), a.attr("name", f), a.attr("value", b[f]), a.appendTo(e); d("body").append(e); e.bind("submit", DownloadedCallback); e.submit() }; d.fn.parse_url = function (a) {
        if (-1 == a.indexOf("?")) return { url: a, params: {} }; var b = a.split("?"), a = b[0], c = {}, b = b[1].split("&"), e = {}, d; for (d in b) {
            var g =
            b[d].split("="); e[g[0]] = g[1]
        } c.url = a; c.params = e; return c
    }
})(jQuery);
(功能(d){

d、 fn.largeDownload=function(a,b,c){void 0!==c?(c=c.toUpperCase(),“GET”!=c&&(c=“POST”):c=“POST”;if(void 0==b | | | 1==b)b=d()(我们通常用2-3个API调用来解决这个问题。我们的应用程序是用Java编写的;然而,同样的基本原则也适用于这里

第一个调用是在一个单独的线程中启动大型SQL查询、大型文件创建等。该请求立即返回,有时带有引用原始请求的id

当CSV中的行在派生线程中写入时,我们在原始线程中为处理的行数和总行数写入两个属性值。如果是大型SQL语句,我们通常将语句本身批处理为几个有限的SQL语句,以便可以增量设置和显示进度值,而不是sitti先在0%下运行一段时间,然后再恢复到100%。分解SQL语句通常只会增加毫秒的成本,但在用户体验方面提供了大量的价值


我们有第二个被轮询的API调用,然后返回处理数和总计数的属性值。这是我们用来设置进度条动画的。当达到100%或调用响应的状态标志改变时,我们通常在单独的API调用中请求完成的文件。您也可以返回文件指针/路径在同一个进度呼叫中。

感谢您提供了一些指导。我不确定是否能够中断sql语句…我的sql语句非常复杂(连接多个表)并带来大量数据。可以理解。您可能希望分析目前大部分时间花在哪里。通常,大部分时间都花在SQL调用中。您不必对查询进行太多修改,您可以指定一个限制,然后每次递增起始索引或偏移量以请求下一组行(按原样设置进度属性)。此外,您似乎正在使用jQuery查看延迟对象:。您可以在单个类中包含所有初始和进度请求,并在进度更新和文件完成时通知调用方。当然,我将查看延迟对象。
    [HttpPost]
    public HttpResponseMessage GetWorkQueueList()
    {
        var resp = new HttpResponseMessage(HttpStatusCode.OK);
        var currentContext = HttpContext.Current;

        try
        {
            string strRequest = currentContext.Request.Form["request"];
            var serializer = new JavaScriptSerializer();
            var request = serializer.Deserialize<ViewRequest>(strRequest);
            request.QueryAllRecords = true;
            var workQueueList = MappingManager.GetWorkQueueList(request);

            var legacyExcelView = //get data as generic list
            ....
            ....

            var fileBytes = ExcelManager.GetExcelData<WQExcelView>(legacyExcelView);
            var stream = new MemoryStream(fileBytes);
            resp.Content = new StreamContent(stream);
            resp.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            resp.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "WorkQueueList.xlsx" };
            resp.Content.Headers.Add("Content-Encoding", "UTF-8");
            return resp;
        }
        catch (Exception ex)
        {                
            resp.Content = new StringContent(ex.Message);
            return resp;
        }
    }