0

URLで変数を渡さずに、POSTをGETにリダイレクトするときに変数を渡すスレッドセーフな方法はありますか?

私が達成しようとしているのはこれです。ユーザーが画像をアップロードできるフォームを含むページがあります。そのフォームは、ブラウザによってPOSTとしてサーバーに送信されます。画像のアップロードが成功すると、ページはGETにリダイレクトされ、ユーザーがアップロードしたばかりの画像を表示します。2つのページ間で変数を渡すことを考えることができる唯一の安全な方法は、GETパラメーターを使用することです。

ImageUpload.php

$imageID = processImageUpload();

if($imageID){
    redirect("/ImageDisplay.php?uploadedImageID=".$imageID)
}

ImageDisplay.php

$uploadedImageID = getRequestVariable('uploadedImageID');
if($uploadedImageID != FALSE){
    //Display the image just uploaded with an 'image uploaded success!' message
}

//Display all the other images

これは世界で最悪の事態ではありませんが、変数をGETパラメーターとして含めるのは少し醜いです。また、リダイレクトされたページでユーザーが更新を押すと、「画像のアップロードが成功しました」と表示されるように、少し誤解を招く可能性があります。画像をアップロードしただけではありませんが、もう一度メッセージを送信してください。

POSTページからGETページに変数を渡すスレッドセーフな別の方法はありますか?

セッション変数またはCookie変数を使用することは、一度に2つの画像がアップロードされる可能性があり、競合状態が発生する可能性があるため、安全ではありません。

リダイレクトを使用して、リファラーヘッダーを読み取ることができると思いました。例:

  1. にリダイレクトするImageUpload.phpへのPOST
  2. GET ImageDisplay.php&uploadedImageID = 123
  3. GET ImageDisplay.phpここで、前のGETリクエストからリファラーを読み取ります。

ただし、リファラーは常にアップロードフォームを保持しているページであり、中間ステップの場合はそうではないようです。

GETパラメーターとして以外に、あるリクエストから別のリクエストに変数を渡す他の方法はありますか?

4

3 に答える 3

1

GETパラメータを渡すことは、次の理由から良い選択だと思います。

  • GETパラメータを使用すると、独立したAPIを作成できます。ユーザーが10枚の写真をアップロードし、パラメーターに10個の異なる値があるとします。「imageName」とします。これで、APIを独立させて、ユーザーが次のような呼び出しを行えるようになります。
    1. .... getImage?imageName = 1
    2. .... getImage?imageName = 2
    3. .... getImage?imageName = 3

リクエストが完了した後でURLを書き換えて、 imageNameパラメータでURLが見苦しくならないようにすることができます。

データをセッションに保持することが最後の手段になると思います。セッション中のデータにより、アプリケーションを実行時にスケーリングすることが非常に困難になります。サーバー上のすべてのセッションが閉じられる前に、メンテナンスのためにサーバーをシャットダウンすることはできません。基本的に、セッションデータは多くの問題を引き起こします。

于 2012-12-26T05:04:55.450 に答える
1

私が提案した方法は醜いですが、クエリ文字列の変数をユーザーに表示しません。

ImageUpload.phpファイルを次のように変更することを検討してください(テストされていないコード)。

$imageID = processImageUpload();

if($imageID){
    <?php
        <!Doctype html>
        <html>
            <head>
                <title>Upload successful! Redirecting...</title>
                <script type="text/javascript">
                    window.onload = function () {
                        document.getElementById("redirectionForm").submit();
                        return;
                    }
                </script>
            </head>
            <body>
                <div style="text-align: center; padding: 50px; font-style: italic;">
                    Image upload successful!
                    <br />
                    Please wait while you are redirected...
                </div>
                <form id="redirectionForm" action="ImageDisplay.php" method="post">
                    <input type="hidden" name="uploadedImageID" value="<?php echo $imageID; ?>" />
                </form>
            </body>
        </html>
    ?>
}

これにより、クライアントにフォームが出力され、関連するPOSTデータ情報を使用してユーザーがImageDisplay.phpにリダイレクトされます。

于 2012-12-26T05:12:22.027 に答える
-1

次のようなカスタムヘッダーを設定できます。

header('X-UploadedImageID: 123');

あなたはheaders_list()によってヘッダーにアクセスすることができます:

headers_list();

これのAvar_dump()は次のようになります。

array(2) {
  [0] =>
  string(35) "X-Powered-By: PHP/5.3.19"
  [1] =>
  string(22) "X-UploadedImageID: 123"
}

したがって、123を取得するには、次のようなことを行う必要があります。

$headers = headers_list();
echo str_replace('X-UploadedImageID: ', '', $headers[1]);

それはあなたに与えるでしょう:123

データを出力する前、およびヘッダーの場所のリダイレクトを呼び出す前に、これらのヘッダーを設定してください。

ImageUpload.phpを次のように変更します。

$imageID = processImageUpload();

if($imageID){
    header('X-UploadedImageID: ' . $imageID);
    redirect("/ImageDisplay.php");
}

ImageDisplay.phpを次のように変更します。

$headers = headers_list();
$uploadedImageID = str_replace('X-UploadedImageID: ', '', $headers[1]);

if($uploadedImageID != FALSE){
    //Display the image just uploaded with an 'image uploaded success!' message
}
于 2012-12-26T05:10:42.603 に答える