jQuery文件下载没有回调工作

公正学习

我正在使用jquery.filedownload带有ASP Web API插件来下载文件并从服务器显示错误消息。

我已经安装了插件并按照github上的指示将cookie添加到了我的响应中:https : //github.com/johnculviner/jquery.fileDownload

我的文件已成功下载,但是回调不起作用。

s

var url = "/WebApi/PayrollBatches/GetBatchCsv?batchId=" + batchId;
$.fileDownload(url, {
 successCallback: function (url) {
       alert('success');
 },
 failCallback: function (responseHtml, url) {
        alert('error');  
 }
 });
return false; 
//this is critical to stop the click event which will trigger a normal file download!

ASP Web API

        [HttpGet]
    public async Task<HttpResponseMessage> GetBatchCsv(int batchId)
    {
        string csv;
        try {
            using (var Dbcontext = new RossEntities()) {
                PayrollBatchExport dal = new PayrollBatchExport(Dbcontext);
                csv = await dal.GetBatchCsv(batchId);
            }
        }
        catch (Exception ex) {
            HttpError myCustomError = new HttpError(ex.Message) { { "CustomErrorCode", 42 } };
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, myCustomError);
        }

        var cookie = new CookieHeaderValue("fileDownload", "true");
        var cookiePath = new CookieHeaderValue("path", "/");
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);

        response.Content = new StringContent(csv);
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        response.Content.Headers.ContentDisposition.FileName = "Export.csv";
        response.Headers.AddCookies(new CookieHeaderValue[] { cookie, cookiePath });
        response.StatusCode = HttpStatusCode.OK;

        return response;
    }

编辑

以下是服务器响应错误500时我的浏览器控制台的外观:

在此处输入图片说明

伊万·西瓦克(Ivan Sivak)

好的,花了一些时间在Fiddler之后,问题出在Cookie上。注意以下代码jquery.fileDownload.js

function checkFileDownloadComplete() {
    //has the cookie been written due to a file download occuring?

    var cookieValue = settings.cookieValue;
    if (typeof cookieValue == 'string') {
        cookieValue = cookieValue.toLowerCase();
    }

    var lowerCaseCookie = settings.cookieName.toLowerCase() + "=" + cookieValue;

    if (document.cookie.toLowerCase().indexOf(lowerCaseCookie) > -1) {

        //execute specified callback
        internalCallbacks.onSuccess(fileUrl);
...

仅当服务器按照项目页面的说明返回cookie时,才会调用成功回调,但是API控制器未正确返回此cookie。该代码对我来说效果很好,并且在官方文档中也有描述

public class PayrollBatchesController : ApiController
{
    [HttpGet]
    public async Task<HttpResponseMessage> GetBatchCsv(int batchId)
    {
        string csv;
        try
        {
            string path = System.Web.HttpContext.Current.Request.MapPath(@"~\Files\testfile.csv");
            csv = File.ReadAllText(path);// await dal.GetBatchCsv(batchId);

        }
        catch (Exception ex)
        {
            HttpError myCustomError = new HttpError(ex.Message) { { "CustomErrorCode", 42 } };
            HttpResponseMessage errorResponse = Request.CreateErrorResponse(HttpStatusCode.InternalServerError, myCustomError);
            errorResponse.Content = new StringContent("error: " + ex.ToString());
            return errorResponse;
        }

        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);

        // Set Cookie
        var cookie = new CookieHeaderValue("fileDownload", "true");
        cookie.Expires = DateTimeOffset.Now.AddDays(1);
        cookie.Domain = Request.RequestUri.Host;
        cookie.Path = "/";
        response.Headers.AddCookies(new CookieHeaderValue[] { cookie });

        // -------------
        response.Content = new StringContent(csv);
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        response.Content.Headers.ContentDisposition.FileName = "Export.csv";
        response.StatusCode = HttpStatusCode.OK;

        return response;
    }
}

请注意,出于演示目的,我不是从DAL而是从测试文件中检索CSV数据,如上面的代码所示。另外,为了完整起见,我附上了客户端代码:

<body>
    <div> 
        <button id="btn" type="button">get</button>
    </div>
    <script src="~/Scripts/fileDownload.js"></script>
    <script>
        $(document).ready(function () {
            $('#btn').click(function () {
                var url = "/api/PayrollBatches/GetBatchCsv?batchId=1";
                $.fileDownload(url, {
                    successCallback: function (url) {
                        alert('success');
                    },
                    failCallback: function (responseHtml, url) {
                        alert('error');
                    }
                });
                return false;
            });
        });
    </script>
</body>

编辑:失败回调

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

$(element).focus() 在回调中没有按预期工作

来自分类Dev

这个没有回调的 JSONP 是如何工作的?

来自分类Dev

没有jQuery的角度$ animate.addClass回调

来自分类Dev

jQuery回调的Wicket AjaxRequestTarget没有组件

来自分类Dev

FileTransfer 插件,下载未在 iOS 上启动,回调没有错误

来自分类Dev

jQuery的动画回调不工作在循环

来自分类Dev

jQuery插件回调无法正常工作

来自分类Dev

Facebook社交登录回调网址在地址栏中没有参数但在本地工作

来自分类Dev

jQuery / Javascript上传和下载没有后端的文件

来自分类Dev

jQuery / Javascript上传和下载没有后端的文件

来自分类Dev

没有回调的JavaScript本机Promise()

来自分类Dev

没有回调的链接功能

来自分类Dev

从Accounts.resetPassword()没有回调

来自分类Dev

Woocommerce 回调函数没有被调用

来自分类Dev

jscolor onchange 回调没有被触发

来自分类Dev

没有为连续调度的文件调用AVAudioPlayerNode完成回调

来自分类Dev

如何在Node.js中使用没有jQuery Ajax请求内的回调?

来自分类Dev

使用Ajax时,我仍然无法使回调工作。它似乎没有在等待回调,我在做什么错?

来自分类Dev

具有回调行为的jQuery .attr()

来自分类Dev

成功注册服务工作者后,为什么没有点击ServiceWorkerRegistration回调?

来自分类Dev

带有$ .getScript回调的jQuery Ajax加载文件传递unkown参数

来自分类Dev

带有$ .getScript回调的jQuery Ajax加载文件传递unkown参数

来自分类Dev

SourceTree没有下载所有文件?

来自分类Dev

流明回调完成下载

来自分类Dev

没有回调的array_filter有什么作用?

来自分类Dev

执行回调后,jQuery无法正常工作

来自分类Dev

HttpRequest文件下载下载没有扩展名的文件

来自分类Dev

具有回调功能的Javascript无法正常工作

来自分类Dev

骨干模型.save()没有成功/错误回调?

Related 相关文章

  1. 1

    $(element).focus() 在回调中没有按预期工作

  2. 2

    这个没有回调的 JSONP 是如何工作的?

  3. 3

    没有jQuery的角度$ animate.addClass回调

  4. 4

    jQuery回调的Wicket AjaxRequestTarget没有组件

  5. 5

    FileTransfer 插件,下载未在 iOS 上启动,回调没有错误

  6. 6

    jQuery的动画回调不工作在循环

  7. 7

    jQuery插件回调无法正常工作

  8. 8

    Facebook社交登录回调网址在地址栏中没有参数但在本地工作

  9. 9

    jQuery / Javascript上传和下载没有后端的文件

  10. 10

    jQuery / Javascript上传和下载没有后端的文件

  11. 11

    没有回调的JavaScript本机Promise()

  12. 12

    没有回调的链接功能

  13. 13

    从Accounts.resetPassword()没有回调

  14. 14

    Woocommerce 回调函数没有被调用

  15. 15

    jscolor onchange 回调没有被触发

  16. 16

    没有为连续调度的文件调用AVAudioPlayerNode完成回调

  17. 17

    如何在Node.js中使用没有jQuery Ajax请求内的回调?

  18. 18

    使用Ajax时,我仍然无法使回调工作。它似乎没有在等待回调,我在做什么错?

  19. 19

    具有回调行为的jQuery .attr()

  20. 20

    成功注册服务工作者后,为什么没有点击ServiceWorkerRegistration回调?

  21. 21

    带有$ .getScript回调的jQuery Ajax加载文件传递unkown参数

  22. 22

    带有$ .getScript回调的jQuery Ajax加载文件传递unkown参数

  23. 23

    SourceTree没有下载所有文件?

  24. 24

    流明回调完成下载

  25. 25

    没有回调的array_filter有什么作用?

  26. 26

    执行回调后,jQuery无法正常工作

  27. 27

    HttpRequest文件下载下载没有扩展名的文件

  28. 28

    具有回调功能的Javascript无法正常工作

  29. 29

    骨干模型.save()没有成功/错误回调?

热门标签

归档