javascript - 如果文件下载错误,则在提交表单上管理JSON服务器响应

标签 javascript php jquery error-handling download

我有一个简单的jQuery代码,当用户单击按钮时,它要求PHP服务器下载文件:

// Build a temp form
var jRestr = {sFitxer: sFitxer, bDownload: true};
var $form = $('<form></form>').attr('action', getMBD_URL()).attr('method', 'post');
// Add the one key/value
$form.append($("<input></input>").attr('type', 'hidden').attr('name', 'Consulta').attr('value', 'downLoadFile.php'));
$form.append($("<input></input>").attr('type', 'hidden').attr('name', 'UserName').attr('value', sessionStorage.usuari));
$form.append($("<input></input>").attr('type', 'hidden').attr('name', 'Token').attr('value', sessionStorage.token));
$form.append($("<input></input>").attr('type', 'hidden').attr('name', 'sFormat').attr('value', 'META'));
$form.append($("<input></input>").attr('type', 'hidden').attr('name', 'Modul').attr('value', sModul_glb));
$form.append($("<input></input>").attr('type', 'hidden').attr('name', 'sjRestr').attr('value', JSON.stringify(jRestr)));
//send request
$form.appendTo('body').submit().remove();

这就像一个符咒,但是如果服务器遇到一些麻烦(找不到文件,权限被拒绝等),它将返回带有错误信息的JSON而不是请求的文件。

如何捕获并以用户可读的格式显示它?

我对可以使用哪种技术感到困惑,因为如果使用AJAX调用,我将不知道如何下载文件,如果使用HTML Submit调用,则会失去响应控制。

最佳答案

主要问题是,除非将文档重定向到某个位置(使用JS window.location 形式提交),否则您无法使用Ajax下载文件。

“正确”的方式

在您的服务器中创建一个端点,以检查文件是否存在(或具有许可权等),可以使用ajax轻松访问该端点,并在成功响应后执行此请求,然后重定向(提交创建的表单)以获取文件。

var url = "new_endpoint_to_check_if_file_exists";

$.ajax({
    url: url,
    type: 'GET',
    success: function() {
        // Here the code to append your form and submit to download file.
    },
    error: function(er){
       console.log(er);
    }
});

另一方面,如果您想控制响应,建议您使用Ajax ,因此请修改服务器上逻辑的工作方式。

丑陋的方式

如果您无法如前所述修改响应逻辑的工作原理,那么从理论上讲您仍然可以下载文件,但是您需要向同一URL提出2个请求(提交表单的2倍)。
// The form Data
var data = {
    'Consulta': 'downLoadFile.php',
    'UserName': sessionStorage.usuari,
    'Token': sessionStorage.token,
    'sFormat': 'META',
    'Modul': sModul_glb,
    'sjRestr' JSON.stringify(jRestr)
};
// The request URL 
var url = getMBD_URL();

$.ajax({
    url: ,
    type: 'POST',
    data: data
    success: function() {
        // If the "file exists or there's no server error"
        // Generate the file download again
        // Build the form and submit again ...
        var jRestr = {sFitxer: sFitxer, bDownload: true};
        var $form = $('<form></form>').attr('action', getMBD_URL()).attr('method', 'post');
        // Add the one key/value
        $form.append($("<input></input>").attr('type', 'hidden').attr('name', 'Consulta').attr('value', 'downLoadFile.php'));
        $form.append($("<input></input>").attr('type', 'hidden').attr('name', 'UserName').attr('value', sessionStorage.usuari));
        $form.append($("<input></input>").attr('type', 'hidden').attr('name', 'Token').attr('value', sessionStorage.token));
        $form.append($("<input></input>").attr('type', 'hidden').attr('name', 'sFormat').attr('value', 'META'));
        $form.append($("<input></input>").attr('type', 'hidden').attr('name', 'Modul').attr('value', sModul_glb));
        $form.append($("<input></input>").attr('type', 'hidden').attr('name', 'sjRestr').attr('value', JSON.stringify(jRestr)));
        //send request
        $form.appendTo('body').submit().remove();
    },
    error: function(er){
       console.log(er);
    }
});

那应该可以解决问题,但是,我会选择“正确”的方法。

关于javascript - 如果文件下载错误,则在提交表单上管理JSON服务器响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38802614/

相关文章:

javascript - 单击提交后,如何重定向到 js 组件并通过 php 将信息发送到 db?

javascript - 将一周事件复制到下周完整日历中

javascript - 使用 Ajax 和 CSS3 的动画

php - 上传 .zip 时,$_FILES 数组在 php 中为空,而 .jpg 工作正常

javascript - 如何在客户端点击按钮时选择不同的leaflet js文件

JQuery UI 旋转选项卡和事件

javascript - 如何在不重新启动服务器的情况下更改 Javascript?

php - 基于浏览器区域设置/位置的自动日期格式化

PHP Laravel 任务调度最佳实践

jquery - IE8 中无效的 JSON 对象,但 Chrome 中无效