【问题标题】:Custom HTTP Response code together with JSON return自定义 HTTP 响应代码以及 JSON 返回
【发布时间】:2016-11-03 01:46:44
【问题描述】:

好的,我有一个基于 ajax 的文件上传,它将文件发送到处理 php 代码。这一切都很好,它返回一个 json_encoded 数组。但是,此数组返回“成功”或“错误”的结果 - 但是,我希望能够实际更改 HTTP 状态代码(目前它们都返回 200 OK,因为它从脚本)。

那么,有没有人有代码允许 PHP 同时发送 http_response_code() 和 json_encoded() 消息?或者可以将我链接到有示例的地方吗?

我已经包含了 process_upload.php 文件的代码,很抱歉长度(大约 130 行) - 接近尾声时我尝试包含 http_status_code(415) 但这没有任何作用.

更新了代码,因为我发现是我误判了触发http_status_code() 的变量在哪里。修复它,它可以工作。

<?php
if (!session_id()) { session_start(); };
require_once('conf/config.php');
require_once('functions.php');
$returnmessage = json_encode(["content"=>"Error Error Error","infotype"=>"error"]);
$changereturnheader = 0;
if ((isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) || $allow_public == true) {
        if (isset($_FILES['file'])) {
            if (in_array('error', $_FILES['file'])) {
                switch ($_FILES['file']['error']) {
                    case 0:
                    $returnerror = false;
                    $returnerrorcontent = '';
                    break;
                    case 1:
                    $returnerror = true;
                    $returnerrorcontent = 'The uploaded file exceeds the upload_max_filesize directive in php.ini';
                    break;
                    case 2:
                    $returnerror = true;        
                    $returnerrorcontent = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
                    break;
                    case 3:
                    $returnerror = true;        
                    $returnerrorcontent = 'The uploaded file was only partially uploaded';
                    break;
                    case 4:
                    $returnerror = true;        
                    $returnerrorcontent = 'No file was selected';
                    break;
                    case 6:
                    $returnerror = true;        
                    $returnerrorcontent = 'Missing a temporary folder. Introduced in PHP 4.3.10 and PHP 5.0.3';
                    break;
                    case 7:
                    $returnerror = true;      
                    $returnerrorcontent = 'Failed to write file to disk. Introduced in PHP 5.1.0';
                    break;
                    case 8:
                    $returnerror = true;        
                    $returnerrorcontent = 'A PHP extension stopped the file upload. Introduced in PHP 5.2.0';
                    break;
                    default:
                    $returnerror = false;
                    $returnerrorcontent = '';
                    break;
                }
            }
            if (isset($_FILES['file']) && $returnerror == false) {
                $allowed = '';
                $allowed_extensions = allowedExtensions('');
                $totalentries = count(allowedExtensions('')) -1;
                for ($i = 0; $i <= $totalentries; $i++) {
                    $allowed .= (($i == $totalentries) ? $allowed_extensions[$i] : $allowed_extensions[$i].', ');
                }
                if (($_FILES['file']['size'] + foldersize($userpath.$username) < $storage_limit)) {
                    if (in_array($_FILES['file']['type'], allowedMimeTypes(''))) {
                        if (in_array($_FILES['file']['type'], allowedMimeTypes('audio'))) {
                            $folder = 'music';
                        } elseif (in_array($_FILES['file']['type'], allowedMimeTypes('image'))) {
                            $folder = 'pictures';
                        } elseif (in_array($_FILES['file']['type'], allowedMimeTypes('video'))) {
                            $folder = 'video';
                        } elseif (in_array($_FILES['file']['type'], allowedMimeTypes('application'))) {
                            $folder = 'documents';
                        } elseif (in_array($_FILES['file']['type'], allowedMimeTypes('text'))) {
                            $folder = 'documents';
                        }
                        $filename = $_FILES['file']['name'];
                        if (file_exists(''.$userpath.$username.$folder.'/'.onlyValidChar($_FILES['file']['name']))) {
                            if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
                                // echo 'exist';
                                $returnmessage = json_encode(["content"=>"$filename already exist","infotype"=>"error"]);
                            }                       
                        } else {
                            move_uploaded_file($_FILES['file']['tmp_name'],''.$userpath.$username.$folder.'/'.onlyValidChar($_FILES['file']['name']));
                            if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
                                // echo 'uploaded file';
                                $returnmessage = json_encode(["content"=>"You uploaded $filename","infotype"=>"success"]);
                            }
                            $movedfile = pathinfo($_FILES['file']['name']);
                            if (in_array(strtolower($movedfile['extension']),allowedExtensions('')) && in_array($_FILES['file']['type'],allowedMimeTypes('image'))) {
                                // createThumbs($userpath.$username.$folder.'/',onlyValidChar($_FILES['file']['name']),200);
                                generate_image_thumbnail($userpath.$username.$folder.'/'.onlyValidChar($_FILES['file']['name']),$userpath.$username.$folder.'/thumbs/'.onlyValidChar($_FILES['file']['name']));
                            }
                            if (in_array(strtolower($movedfile['extension']),allowedExtensions('')) && in_array($_FILES['file']['type'],allowedMimeTypes('video'))) {
                                $video = $_SERVER['DOCUMENT_ROOT'].'/'.$userpath.$username.$folder.'/'.onlyValidChar($_FILES['file']['name']);
                                $thumbnail = $_SERVER['DOCUMENT_ROOT'].'/'.$userpath.$username.$folder.'/thumbs/'.onlyValidChar($_FILES['file']['name']).'.jpg';
                                $get_frames = shell_exec("/usr/local/bin/ffmpeg -nostats -i $video -vcodec copy -f rawvideo -y /dev/null 2>&1 | grep frame | awk '{split($0,a,\"fps\")}END{print a[1]}' | sed 's/.*= *//'");
                                $stills_number = floor($get_frames / 200);
                                $output = shell_exec("/usr/local/bin/ffmpeg -y -i $video -frames 1 -q:v 1 -vf 'select=not(mod(n\,$stills_number)),scale=-1:120,tile=100x1' $thumbnail");
                            }
                            updateCurrentUploads('current_uploads.php',$_FILES['file']['name']);
                        }
                    } else {
                        if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {                                
                            $changereturnheader = 1;
                            $returnmessage = json_encode(["content"=>"The filetype you tried to upload is not allowed","infotype"=>"error"]);
                        }
                    }
                } else {
                    echo 'exceeding diskspace';
                    $returnmessage = json_encode(["content"=>"The file will exceed your available diskspace. Delete some of the files already uploaded to make room","infotype"=>"error"]);
                }
            } elseif ($returnerror == true) {
                if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
                    // echo 'error-message return';
                    $returnmessage = json_encode(["content"=>"$returnerrorcontent","infotype"=>"error"]);
                }
            } else {
                if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
                    // echo 'filetype not allowed 2';
                    $changereturnheader = 1;
                    $returnmessage = json_encode(["content"=>"The filetype you tried to upload is not allowed","infotype"=>"error"]);
                }
            }
        }
    // echo returnCurrentUploads('current_uploads.php');
        if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
            // echo 'returnmsg';
            if ($changereturnheader == 1) {
                http_response_code(415);
            }
            echo $returnmessage;
        } else {
            header('location: upload');
        }
    }
?>

【问题讨论】:

    标签: php json ajax http-headers


    【解决方案1】:

    我可以发送 http_response_code(415) 并发送 json:

    <?php
    
    $array = array(
      'one' => array(1, 2, 3),
      'two' => array(4, 5, 6),
      'three' => array(7, 8, 9),
    );
    
    http_response_code(415);
    echo json_encode($array);
    

    【讨论】:

    • 嗯。这和我做的差不多。我会尝试更多。
    • “那么,有没有人有代码允许 PHP 同时发送 http_response_code() 和 json_encoded() 消息?” - 请问我有解决办法吗?
    【解决方案2】:

    我相信您的 php 版本可能不支持该功能。

    你能不能试试header功能

    header("HTTP/1.0 415 Unsupported Media Type");
    

    而不是

    http_response_code(415);
    

    看看有没有帮助

    【讨论】:

    • 我使用 PHP 7.1 - 它支持。请参阅我自己的答案。
    【解决方案3】:

    我很愚蠢,这是我的视力问题,而不是功能。我设置了两种不同的返回消息,一种用于通过 AJAX 完成的请求,另一种用于通过常规的非 AJAX 文件传输。我只应用了在非 AJAX 上传时启用http_status_code() 的变量。将其添加到应有的位置后,它就可以正常工作。我也修改了问题中的代码,所以它现在可以工作了。

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多