【问题标题】:HTML return instead of JSON dataHTML 返回而不是 JSON 数据
【发布时间】:2015-11-28 11:40:16
【问题描述】:

我试图弄清楚为什么我的 PHP 代码返回 HTML 页面而不是我正在寻找的 JSON 数据。该代码本质上允许上传文件。如果我上传一个相当小的文件(650KB),一切都会按预期工作。但是,当我上传更大的文件 (20MB) 时,文件仍然可以正常上传,但我没有返回所需的 JSON 数据。

这是我的 PHP 代码,没有实际的文件处理:

<?php
session_start();

if($_SESSION['status_cp'] != 1){
    header("Location: index.html");
}

// include the files for accessing the 'live' database
include('assets/database/dbConfig.php');
include('assets/database/dbFns.php');
include('assets/utilities/ImageResizer.php');

$ret["success"] = false;

$picsFolder = "pics/";
$uploadsFolder = "uploads/";

if(isset($_FILES["file"])) {
    // handle the file here...
    $ret["success"] = true;
}

echo json_encode($ret);
?>

因此,对于较大的上传,返回的基本上是“index.html”文件。似乎会话即将到期并重定向到 HTML!?!。

另外,如果我删除了代码顶部的会话代码,一切都会按预期工作;返回正确的 JSON 数据。但是,我希望该代码在那里,所以不只是任何人都可以调用它。

由于我怀疑超时问题,我已将以下内容包含在 .htaccess 文件中并放置在网站的根目录中,但这没有任何区别。在服务器上运行 phpinfo() 确认正在使用这些设置。

php_value upload_max_filesize 110M 
php_value post_max_size 120M
php_value max_execution_time 10800
php_value max_input_time 10800

调用 PHP 的 javascript 代码:

var formData = new FormData();
formData.append('file', file);

var uploadURL = "upload.php";
var jqXHR = $.ajax({
    xhr: function() {
        var xhrobj = $.ajaxSettings.xhr();

        if (xhrobj.upload) {
            xhrobj.upload.addEventListener('progress', function(event) {
                var percent = 0;
                var position = event.loaded || event.position;
                var total = event.total;

                if (event.lengthComputable) {
                    percent = Math.ceil(position / total * 100);
                    console.log('percent: ' + percent);
                }

                // set progress
                status.setProgress(percent);
            });
        }

        return xhrobj;
    },
    url: uploadURL,
    type: 'POST',
    contentType: false,
    processData: false,
    cache: false,
    data: formData,
    success: function(data) {
        var response = jQuery.parseJSON(data);
    }
});

谢谢。感谢您提供任何帮助。

[编辑]

来自var_dump($_POST, $_FILES); 的结果

array(5) {
  ["typeId"]=>
  string(6) "tender"
  ["id"]=>
  string(2) "27"
  ["name"]=>
  string(8) "Test"
  ["documentName"]=>
  string(7) "Testing"
  ["transferToFtp"]=>
  string(4) "true"
}
array(1) {
  ["file"]=>
  array(5) {
    ["name"]=>
    string(25) "mbam-setup-2.1.6.1022.exe"
    ["type"]=>
    string(24) "application/x-msdownload"
    ["tmp_name"]=>
    string(48) "/storage/nfs/hmu_storage_02/shared/tmp/phpFrkeye"
    ["error"]=>
    int(0)
    ["size"]=>
    int(21546080)
  }
}

【问题讨论】:

  • 会话问题需要更多调查:如果您找不到您正在寻找的会话变量值,那么应该有一个很好的理由(可能一开始没有设置,等等)

标签: php html json .htaccess


【解决方案1】:

好吧,事实证明会话变量确实设置不正确,但@Praveen 通过提供有价值的信息加快了调试过程。我的 login.php 本地副本设置了正确的会话变量,所以我最初没有查看它。最后,我确实查看了实际在服务器上的 login.php 文件,它确实有所不同......

将正确的副本上传到服务器更正了问题,现在 JSON 数据按预期返回。

【讨论】:

    【解决方案2】:

    请在顶部添加:

    header("Content-type: application/json");
    

    如果您觉得会话没有设置好,请尝试使用:

    session_start();
    

    以上代码为必填项。我在你的代码中看不到。

    【讨论】:

    • 是的,session_start(); 在我的代码中。我忘了把它包括在样本中。我将header("Content-type: application/json"); 放在了第一行,但没有任何区别?
    • @Terry 你启用了所有的错误吗?错误日志或访问日志显示什么?
    • 你也用过if(isset($_FILES["file"])),那你怎么称呼这个PHP?给我看之前触发这个调用的 HTML 代码。
    • 我需要研究如何启用错误日志记录。我已经修改了我的原始帖子以显示调用 PHP 代码的 javascript 代码。
    • @Terry 只需将ini_set("display_errors", 1); 放在顶部即可。
    猜你喜欢
    • 2020-04-11
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多