"Disallowed key characters in global data" 带有 Unicode 垃圾

"Disallowed key characters in global data" with Unicode garbage

通过 Overflow 进行搜索,看看是否可以找到解决此问题的方法,但不幸的是,似乎没有任何内容足够具体。

我正在构建一个具有照片上传功能的 Ionic 应用程序(使用 cordova-filetransfer 插件),并设置了一个 API 端点来接收图像。 Ionic JS 能够成功处理图像,但是 API 返回 "disallowed keys" 错误;只有它充满了随机乱码废话。

clean_input函数:

public function clean_input_keys($str)
{
    $chars = PCRE_UNICODE_PROPERTIES ? '\pL' : 'a-zA-Z';


    if ( ! preg_match('#^['.$chars.'0-9:_.-]++$#uD', $str))
    {
        exit('Disallowed key characters in global data: '.$str."\n [GLOBAL vars] \n".Kohana::debug($GLOBALS));
    }

    return $str;
}

完整回复:

Disallowed key characters in global data: '()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÛ
[GLOBAL vars]
<pre>array: </pre>

来自移动应用程序的 uploadImage 功能:

$scope.uploadImage = function(datetime) {

        // Destination URL
        var uploadUrl = "url/goes/here";

        // File for Upload
        var imagePath = $scope.urlForImage($scope.image);
        console.log('Path: '+imagePath);

        // File name only
        var filename = $scope.addZero(datetime.getDate()) + $scope.addZero((datetime.getMonth() + 1)) + datetime.getFullYear() + '-' + $scope.addZero(datetime.getHours()) + $scope.addZero(datetime.getMinutes()) + '-' + $scope.incidentData.store + '-' + $scope.incidentData.location + '.jpg';
        filename = filename.replace(/\s+/g, '');
        console.log('Filename: '+filename);

        var success = function (r) {
            console.log("Code = " + r.responseCode);
            console.log("Response = " + r.response);
            console.log("Sent = " + r.bytesSent);
        };

        var fail = function (error) {
            alert("An error has occurred: Code = " + error.code);
            console.log("Upload error source " + error.source);
            console.log("Upload error target " + error.target);
        };


        var options = new FileUploadOptions();
        options.fileKey = "image";
        options.fileName = filename;
        options.chunkedMode = false
        //mimeType: "multipart/form-data",
        options.mimeType = "image/jpeg";

        var params = {};
        params.fileName = filename;

        options.params = params;

        var headers = {
                "API-Key": "keygoeshere",
                "Content-Type": "application/x-www-form-urlencoded"
            };

        options.headers = headers;

        var ft = new FileTransfer();

        ft.upload(imagePath, uploadUrl, success, fail, options);
    }

和 API 端点函数:

public function upload_image()
{
    $this->authorise();

    $file_temp = $_FILES['image']['tmp_name'];
    $file_name = $_FILES['image']['name'];
    $target_path = 'path/goes/here';

    if (move_uploaded_file($file_temp, $target_path.$file_name)) {
        Kohana::log('debug', 'File received: '.$_FILES['image']['name']);
        Kohana::log_save();
    } else {
        Kohana::log('debug', 'Photo upload failed');
        Kohana::log_save();
    }
}

抱歉,如果代码有点多,但我终生无法解决此错误的根源 - 有什么建议吗?

问题原来是 headers:我发布了插件默认发送的 header (Content-Type);两者发生冲突并导致错误。

删除此 header,仅保留 API-Key,已允许发送图像。