1

作業中の .php ページが 2 つあります。Index.php には、index.php に投稿するファイル アップロード フォームがあります。フォームを送信した後、index.php で問題なく $_FILES にアクセスできます。

私の問題は、(フォームの送信とページの読み込み後) .ajax (jQuery) を使用して別の .php ファイルを呼び出して、ファイルを開いて行の一部を処理し、結果を ajax に返すことができるようにすることです。その後、ajax は結果を表示し、それ自体を再帰的に呼び出して次の行のバッチを処理します。

基本的には、csvをチャンクで処理(DBなどに入れる)し、チャンクの間にユーザーに表示したいと考えています。ファイルは400,000行以上あり、ユーザーはそれらすべてが処理されるまで10分以上待ちたくないので、私はこのようにしています。

このファイルを移動 (保存) したくありません。処理して破棄するだけでよく、処理中にユーザーがページを閉じてもファイルは破棄されないからです。cron スクリプトを実行できますが、したくありません。

私が本当にやりたいのは、(単一の) $_FILES を .ajax に渡すか、2 ページ目で使用するために $_POST または $_SESSION に保存することです。

私の目的に希望はありますか?

それが役立つ場合は、ajaxコードを次に示します。

    function processCSV(startIndex, length)
    {
        $.ajax({ 
            url: "ajax-targets/process-csv.php", 
            dataType: "json",
            type: "POST",
            data: { startIndex: startIndex, length: length },
            timeout: 60000, // 1000 = 1 sec
            success: function(data) {
                // JQuery to display the rows from the CSV

                var newStart = startIndex+length;
                if(newStart <= data['csvNumRows']) {
                    processCSV(newStart, length);
                }
            }
        });
    }
    processCSV(1, 2);
});

PS 私はこの$_FILES または $_POST を PHP で新しいページに渡すことを試みましたが、うまくいきません :( SOS.

明確にするために:私の問題は、ajaxによって呼び出されるページの $_FILE にアクセスしたいということです。ファイルは index.php にアップロードされ、フォームは action="#" であるため、index.php に投稿されます。ポスト index.php が process-csv.php に ajax 呼び出しを送信した後、process-csv.php でファイルにアクセスできるようにする必要があります。古いファイルをクリーンアップする必要がないため、ファイルを移動したくありません。

4

2 に答える 2

1

だから私はあなたがあなたの問題を言ったことはないと思いますが、あなたの問題はファイルをajaxできないことだと思います。その理由は、セキュリティ上のリスクがあるため、javascript で実際にファイル情報を取得できないためです。ただし、これを行う方法はたくさんあります。フラッシュまたは iframe を使用して、ファイルのアップロードのような ajax を偽造することができます。

jQuery iframe ファイルのアップロード

私は実際にはフラッシュバージョンが好きですが、一度に複数のファイルをアップロードする機能があり、iframe が行うすべてのことと、より多くのイベントを提供します。

http://code.google.com/p/swfupload/

uploadComplete を使用して、処理コードを配置し、uploadStart を使用してマーカーを渡し、このセッションをデータベースに追加されたファイルにリンクすることができます。

また、処理中に常にどこまで到達したかを確認してください。そのため、毎回同じ行を返し続けることはありません。

それが役立つことを願っています。

于 2012-12-13T23:20:14.153 に答える
1

JavaScript でデータ行を作成するだけです。

data: { 
    startIndex: startIndex, 
    length: length, 
    rows: variableWithRows.slice(startIndex, startIndex + length)
},

PHP 内では、すべての行が$_POST['rows']配列データとして含まれます。

于 2012-12-13T23:24:52.607 に答える