Extjs 4(下面有3.4的代码)下载从post请求返回的文件

2024-04-15

我看到了与此略有相关的问题,但没有一个能回答我的问题。我设置了 Ext.Ajax.request 如下:

var paramsStringVar = 'param1=1&param2=two&param3=something&param4=etc';

Ext.Ajax.request({
  url: '/cgi-bin/url.pl',
  method:'POST',
  params:paramsStringVar,
  timeout:120000,
  success: function(response, opts){
    var objhtml = response.responseText; //content returned from server side
    console.log(objhtml);
  }

});

该请求从后端检索适当的内容。一个参数是outputType,它可以取值{html, excel, csv}。当返回 html 来显示时,我能够正确处理和显示它。现在来解决问题...

当我将 outputType 参数设置为 csv 或 excel 时,我会根据请求返回 csv 或 tsv(excel) 形式的适当内容。但是,我不需要内容,我想要提示下载文件(csv 或 excel)。如何让浏览器自动提示用户下载文件,而不是仅仅检索 extjs 中的文本内容?

版本 4.07,所以我无法使用任何 4.1 独有的功能


似乎没有万无一失的解决方案,但我会尝试以下几种方法:

1) Use an iframe而不是真正的 XHR 将数据 POST 到服务器,例如<form action="/something" target="myiframe"> where myiframe is the name隐藏的 iframe 的。这样,您的表单将使用 iframe(而不是您的主窗口)将数据提交到配置的 URL。您的服务器应将响应标头设置为application/octet-stream(或二进制数据的某种 MIME 类型),以便浏览器触发下载。否则(如果在您的情况下返回 html),您可以只检索 iframe 的 body insideHTML 并将其显示在 UI 中的用户。虽然使用 iframe(或新窗口)而不是 XHR 听起来不是最好的主意,但此解决方案似乎是迄今为止最可靠的(并且具有最佳的浏览器支持)。

这是一个稍微修改过的例子扩展形式基本 http://docs.sencha.com/ext-js/4-0/#!/api/Ext.form.Basic文档页面:

Ext.create('Ext.form.Panel', {
    title: 'Basic Form',
    renderTo: Ext.getBody(),
    width: 350,

    // Any configuration items here will be automatically passed along to
    // the Ext.form.Basic instance when it gets created.

    // *THIS* makes the form use a standard submit mechanism, not XHR
/**/standardSubmit: true,

    // URL to submit to
    url: 'save-form.php',

    items: [{
        fieldLabel: 'Field',
        xtype: 'textfield',
        name: 'theField'
    }],

    buttons: [{
        text: 'Submit',
        handler: function() {
            // The getForm() method returns the Ext.form.Basic instance:
            var form = this.up('form').getForm();
            if (form.isValid()) {
                // Submit the Ajax request and handle the response
                form.submit({
                    success: function(form, action) {
                       Ext.Msg.alert('Success', action.result.msg);
                    },
                    failure: function(form, action) {
                        Ext.Msg.alert('Failed', action.result.msg);
                    },

                    // You can put the name of your iframe here instead of _blank
                    // this parameter makes its way to Ext.form.Basic.doAction() 
                    // and further leads to creation of StandardSubmit action instance
/**/                target: '_blank'                        
                });
            }
        }
    }]
});

这里有两个关键参数(标有/**/):

  1. standardSubmit: true您传递给表单的配置将使其执行标准提交而不是 XHR。
  2. 通过一个target表单的参数submit行动。此功能没有记录,但您可以看到它被用于扩展表单操作提交 http://docs.sencha.com/ext-js/4-0/source/Submit.html#Ext-form-action-Submit源代码(您传递给的所有选项Ext.form.Basic.submit() http://docs.sencha.com/ext-js/4-0/#!/api/Ext.form.Basic-method-submit方法最终作为 Ext.form.action.* 实例的参数。

在我输入的示例代码中target: '_blank'证明它可以立即工作(将创建一个新的浏览器窗口)。您可以稍后将其替换为 iframe 的名称,但我建议您首先测试表单如何将数据提交到常规新窗口,然后开发创建和处理 iframe 的逻辑。你必须自己在 iframe 内处理结果,我想。没那么难,看看Ext.data.Connection.upload() http://docs.sencha.com/ext-js/4-0/source/Connection.html#Ext-data-Connection-method-upload实现作为 iframe 处理的示例。

ExtJS 实际上已经使用了iframe文件技术uploads. See 外部数据连接 http://docs.sencha.com/ext-js/4-0/#!/api/Ext.data.Connection and Ext.form.field.Field.isFileUpload() http://docs.sencha.com/ext-js/4-0/#!/api/Ext.form.field.Field-method-isFileUpload了解它如何运作。

2)这里推荐:使用 HTML5/Javascript 生成并保存文件 https://stackoverflow.com/questions/2897619/using-html5-javascript-to-generate-and-save-a-file.

如果你不想走 iframe 方式,你可以尝试生成data URI从响应数据中导航到触发下载的 URI:

content = "Hello world!";
uriContent = "data:application/octet-stream," + encodeURIComponent(content);
window.location.href = uriContent;

再次强调,mimetype 在这里至关重要。这对我有用,但是您应该注意,浏览器对数据 URI 施加了大小限制(256Kb 是安全的选择)。

3)上述线程中的另一个答案链接到文件保存器.js https://github.com/eligrey/FileSaver.js库实现了(废弃?)w3 规范。使用与演示here http://eligrey.com/blog/post/saving-generated-files-on-the-client-side。它使用 [BlobBuilder] 生成二进制数据 blob,该数据进一步用于使用多种方法之一初始化下载。虽然此解决方案似乎有效,但它使用已弃用的 API,并且可能无法面向未来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Extjs 4(下面有3.4的代码)下载从post请求返回的文件 的相关文章

  • 在分页数之间添加点

    我已经用 PHP 和 AJAX 为表格编写了分页代码 每页将显示表格的 8 行 到这里为止一切正常 我现在需要的是使分页看起来像一系列数字和它们之间的点 如下所示 1 2 3 27 28 29 我有两个用于分页的文件 conf php
  • 如何保证按一定顺序调用的AJAX请求得到相同顺序的响应?

    如何保证按一定顺序调用的AJAX请求得到相同顺序的响应 首先 请记住 服务器本身可能不会按照收到请求的顺序返回响应 想象一下 如果您首先触发一个复杂的 ajax 请求 然后触发一个简单的 ajax 请求 可能引用一些缓存的静态数据 第二个请
  • android中如何处理图片下载不完整的情况?

    我正在应用程序中下载图像以将其填充到用户界面上 这是我用来下载该图像并将其保存到设备外部存储器的代码 File firstDirectory new File Environment getExternalStorageDirectory
  • R Shiny - 将 csv 下载到工作目录

    我有一个 Shiny 应用程序 我想在其中完成以下任务 1 用户按下按钮 2 数据框导出为 csv 保存在工作目录 包含 server R 和 ui R 中 或者最好保存在下一级目录中 我希望这种情况自动发生 因为最终我会将其与 check
  • 在表中显示ajax响应

    显示 html div style display none table class table p Select All p table div
  • Ajax 成功时强制下载 .mp3 或 .zip 文件

    用户填写电子邮件验证表单 通过 AJAX 提交 后 如果 AJAX 调用响应成功 我想强制在当前浏览器窗口中开始下载 电子邮件验证表单如下所示
  • XMLHttpRequest 无法加载 ZScaler 的问题

    我在 EC2 实例中托管了一个网站 并使用以下命令访问该页面http ec2 网址 该页面向同一实例上托管的另一个 Web 应用程序发出 ajax 请求 如果我访问通过 ZScaler 代理的页面 我会得到XMLHttpRequest ca
  • AJAX 将 JavaScript 字符串数组发送到 JsonResult 作为 List 始终返回 Null?

    我正在尝试在 JavaScript 中构建一个字符串数组 并在操作方法的字符串列表中获取结果 下面是我的 JavaScript 的样子 我正在使用 jQuery 1 4 2 问题是我的操作方法中的列表始终显示 NULL JavaScript
  • 如何使用p:ajax按顺序更新多个组件

    我正在尝试呈现以下 JSF 页面
  • mvc3中如何通过ajax调用局部视图

    我需要通过ajax调用部分视图 我已尝试以下操作 但我不确定如何完成 UserName change function var userid UserName val var ProvincialStateID State val var
  • 从 php 脚本返回 JSON 对象

    我正在做一个AJAXGET使用 jQuery 向 PHP 文件发出请求 我希望 PHP 脚本返回一个 JSON 对象 但是目前它返回一个 JSON 字符串 我意识到我可以使用JSON parse然而 在 jQuery 代码中 我对 API
  • Phonegap 中使用 AJAX 的 CSRF 令牌

    我正在开发一个应用程序Phonegap使用 Django 后端 后端使用csrf 所以我需要我的Phonegap要使用的应用程序csrf所以它可以与Django 我读到你可以使用csrf通过Ajax 但我没能让它工作 您能举个例子告诉我我该
  • 使用 AJAX (jQuery) 加载日期在 div 内无限滚动

    我一直试图通过几个问题来解决这个问题 找出不同的部件 然后组装它们 但现在我放弃了 我正在尝试做的事情 用户在页面上单击按钮 然后使用 jQuery ajax 将内容列表加载到 div 中 当他或她滚动到 div 底部时 加载更多内容 正如
  • 使用 ajaxFileUpload 上传具有不同文件 ID 的多个文件

    我正在尝试以同一表单上传多个文件 多个文件应该位于不同的字段中 我对单个文件使用 ajaxfileuploader 并使用 MultipartHttpServletRequest 接收它 它成功了 I used ajaxFileUpload
  • 为页面上的所有 AJAX 请求添加“钩子”

    我想知道是否可以 挂钩 每个 AJAX 请求 无论是即将发送的请求 还是事件上的请求 并执行操作 此时 我假设页面上还有其他第三方脚本 其中一些可能使用 jQuery 而另一些则不使用 这可能吗 注意 接受的答案不会产生实际的响应 因为它被
  • 如何使用 JSON 和 Perl (HTML::Mason) 通过 AJAX 创建动态网页?

    我对处理 Javascript JSON 和 Peel 的方式感到有些困惑 而且大多数示例都是 PHP 语言 这对我没有帮助 我有一个页面 称为 main html 其中包含来自 MySQL 的数据 并且可以选择按 id 删除行 然后我让
  • 使用 JSON 响应

    执行 ajax 请求后 我从服务器收到以下响应 error false success true 我的ajax代码 ajax url update type post data this serialize success function
  • 从 contenteditable div 获取价值

    到目前为止 我一直使用文本区域作为表单的主要输入 我已将其更改为使用contenteditablediv 因为我想允许一些格式 以前 当我有文本区域时 可以使用 Ajax 和 PHP 很好地提交表单 现在我已经将其更改为使用 content
  • 自动完成请求/服务器响应是什么样的?

    这似乎是一个黑洞 经过一个小时的搜索jQuery用户界面 http en wikipedia org wiki JQuery UI网站 Stack Overflow 和谷歌搜索 我还没有找到如何编写的最基本信息服务器端自动完成的 向服务器传
  • Extjs - 如何在网格列中显示组合框

    我有一个网格面板 包括日期和组合列jsfiddle http jsfiddle net YjYqX 但我不想点击显示我的组合 我想在不点击的情况下显示我的组合 而不是像隐藏在单元格内一样 日期列也一样 我认为改变clicksToEdit 0

随机推荐