2009-04-15 15 views
18

イメージをPHPセッションに保存できますか?PHP - SESSIONデータにイメージを保存しますか?

私は自分のサイトでPHPを使用して複数ステップ登録プロセスを行っています。いずれかの手順で、ユーザーは会社のロゴ(画像)をアップロードできます。

最後のステップは、クレジットカードの処理です。

ウェブサーバーに画像を書き込む前に、データベースに画像を書き込む前に、クレジットカードが有効で処理されていることを確認したいと思います。

このように、一時的にその画像データをSESSION変数に格納することは可能ですか?

もしそうでなければ、人々は一時的にそのデータをコミットする前にフォームに画像データを保存するのですか?

答えて

29

イメージのサイズによっては、セッションのメモリ使用量が増えることが予想されますが、これを行うには、ファイルの内容をセッション変数に保存する必要があります。

セッションデータにあり、アップロード後に複数の手順がある場合、手順が完了するまで、画像はすべてのページビューに再ロードされます(セッションに再ロードされます)。

バイナリファイルを保持するためにセッションを使用することを個人的にお勧めします。登録が完了するまでディスク上のイメージを一時的な場所に保存する。セッションの一時ファイルへのパスのみを保存します。 transacitonが完了したら、適切な場所に移動し、dbの挿入を行います。

また、セッションデータはディスク(またはデータベース)に保存されるため、イメージファイルを一度保存​​してから、一度完了したら移動コマンドを発行することもできます。

+2

登録に失敗したらどうなりますか?別のPHPインスタンスに関連する画像なので、削除する画像をどのように知っていますか? – Burimi

0

はい、PHPセッションで画像を保存できます。 PHPを文字列(バイナリデータ)として取得し、それをセッションに入れることができます。

必要なだけの大きさにする必要があります。セッション内の大量の情報がセッションの起動を遅くするため、不要にしたらすぐに削除する必要があります。

3

ファイルがアップロードされると、$ _FILES配列に一時的な名前が割り当てられます。これらのファイルの正確な寿命は分かりませんが、セッションでその名前を取得し、CCが検証されるまでmove_uploaded_file()呼び出しを停止することができます。

または、まずCC手順を実行できます。

+0

PHPスクリプトの実行が終了すると、$ _FILES配列内のすべてのファイルが削除されます。つまり、アップロードされたファイルは、別の場所に移動していないと失われます。 – Serg

9

ファイルをディスクに保存すると、ユーザーのセッションIDを使用して名前を付けることさえできます。その後、クーロンジョブとして実行され、正常に支払ったことのない人の画像を削除するクリーンアップスクリプトのいくつかの並べ替えがあります。

セッションで画像を保存しようとすると、間違ったことになります。

1

時々、データをデータベースに保存する前に、ページをプレビュー/確認する必要があります。 しかし、確認ページへの画像ファイルは少し違いがあります。あなたはできません $_SESSION['s_name'] = $_FILES['f_name'] coz SESSIONはテキストファイルを保存しています。 ファイル内容/バイナリ値をセッション中に保持する代わりの方法です。

$_SESSION['obj_image_session'] = file_get_contents($_FILES['image_name']['tmp_name']); 

$file= "new_file.jpg"; 
$fp=($file,"w"); 

fwrite($fp,$_SESSION['obj_image_session']); 
1

データを保存する必要がある場合は、base64_encoded文字列として保存することをお勧めします。base64_encode画像データをブラウザに直接送ることができます。

もし私が似たような状況になるのであれば、私はむしろイメージを保存し、セッション/ dbのイメージに関する情報を保持していたはずです。何らかの理由で登録が失敗した場合は、後でファイルのリンクを解除します。場合によってはcronジョブを実行して、画像との不足しているリンクを特定します。

しかし、私は本当に第2の選択肢に固執し、面倒を避けることをお勧めします。

0

イメージデータを簡単にベースにエンコードされたセッションとして保存できます。運用サーバーでは、十分なRAMが必要です。 私のアプリケーションは、mongoDBをインストールする前に、更新と変更のために4枚の画像/アプリケーションを40MBまで必要としました。 (ベースエンコーディングは、1.3倍の画像サイズになります。)

$tmpNameSS1 = $_FILES["screenshot1"]["tmp_name"]; 
    $fp  = fopen($tmpNameSS1, 'r'); 
    $rawDataSS1 = fread($fp, filesize($tmpNameSS1)); 
    fclose($fp); 
    $SS1FileName = $_FILES["screenshot1"]["name"]; 
    $encodedSS1Data = base64_encode($rawDataSS1); 

    registry::update('sCreateSS1Name', $SS1FileName); 
    registry::update('sCreateSS1Data', $encodedSS1Data); 

場合は、次のようになります。あなたは、複数アップロードする画像とサイズやタイプのクライアントとサーバーの両方の検証を持っています。セッションからフェッチするほうが高速です。 DBを挿入した後、画像を保持する変数をnullにします。コードがブロックの最後に到達した後、あなたは空の文字列と画像のためのセッションを更新することができます

<img src="data:image/;base64,<?php echo registry::get('sCreateSS1Data'); ?>"/> 

ブラウザが持つイメージのショーが表示されます。典型的なケースは、フォームフィールドを検証で更新する場合と、ユーザーがテキストを変更したい場合です。また、失敗した更新の間にアップロードされた画像を表示することもできます。ラウンドトリップ(推奨)を保存したい場合は、セッション中にデータを保持し、コード終了後にその値を空にします。

関連する問題