web-dev-qa-db-ja.com

AJAX の問題 - Zipファイルを処理するときにSyntaxErrorが見つかりませんでした

ユーザーがフォームに記入し、送信時にカスタマイズしたZipファイルをダウンロードできるようにするアプリケーションを作成しています。私はこのタスクを達成するためにAJAXを利用しています。

    Build.prototype.ajaxHandler = function(method, values) {
        jQuery.ajax({
            type: 'POST',
            url: WP_LOCALIZED['url'],
            data: {
                action:     'request_handler',
                method:     method,
                data:       values
            }, success: function(data) {
                var response = jQuery.parseJSON(data);
                console.log(response);

            }, error: function(XMLHttpRequest, textStatus, errorThrown) {
                console.log(XMLHttpRequest, textStatus, errorThrown);
            }
        });
    };

Ajaxハンドラーで基本データを返そうとすると問題なく返事を返すことができますが、Zip_file()メソッドが実際にはjavascriptメソッドにデータを返さないにもかかわらず、私は常にUncaught SyntaxError: Unexpected token <を取得します。

/**
 * AJAX handler
 * 
 * @return {json}
 * @since 1.0
 */
public function request_handler()
{

    $post = $_POST;
    $data = $post['data'];

    // If this wasn't here it would return my $data variable
    $this->Zip_file();

    die(json_encode($data));
}

また、Zip_file()メソッドをinit()関数に配置することで独自にテストしましたが、問題なく実行できると予想されるとおりに実行されます。

/**
 * Create Zip File
 * 
 * @return void
 * @since 1.0
 */    
public function Zip_file()
{
    $Zip = new ZipArchive;

    if($Zip->open('test.Zip', ZipArchive::CREATE) === TRUE) {
        if($Zip->addEmptyDir($this->_plugin_path . 'assets/temp_files')) {
            // Do stuff
        }
        $Zip->close();
    }

    header('Content-Type: application/Zip');
    header('Content-disposition: attachment; filename=filename.Zip');
    header('Content-Length: ' . filesize($Zip));
    readfile($Zip);
}

興味深いことに、$this->Zip_file()呼び出しを基本的なechoステートメントに置き換えた場合も同じことが起こります。 Unexpected token<であることを私に伝える代わりに、それは代わりにeを言います。

私は、この2つが相互に作用する方法について基本的なことを誤解していると思いますが、これまでのところ、それに関する情報を見つけることができませんでした。

任意の助けがいただければ幸いです。

2
voodooGQ

AJAXレスポンスを返す前にバッファをクリアするようにしてください。

    public function request_handler() {

    $post = $_POST;
    $data = $post['data'];

    $this->Zip_file();
    ob_clean();
    echo json_encode($data);

    die();
}
2
Rachel Baker