簡體   English   中英

PHP - 在 SESSION 數據中存儲圖像?

[英]PHP - Store Images in SESSION data?

您可以將圖像存儲在 PHP SESSION 中嗎?

我在我的網站上使用 PHP 進行了多步注冊。 在其中一個步驟中,用戶可以上傳他們公司的徽標(圖像)。

最后一步是處理他們的信用卡。

因此,在我將任何圖像寫入 web 服務器並將圖像位置寫入數據庫之前,我想確保他們的信用卡有效並且可以處理。

因此,是否可以將該圖像數據暫時存儲在 SESSION 變量中?

如果不是,人們在提交數據之前如何臨時將圖像數據存儲在 forms 上?

您可以預期會話的內存使用量會根據圖像的大小而增加。 為此,您必須將文件內容保存到會話變量中。

如果它在會話數據中並且您在上載后有多個步驟,則會在每個頁面視圖中重新加載(進入會話)圖像,直到步驟完成。

我個人建議不要使用會話來保存二進制文件。 將映像保存到臨時位置,直到注冊完成。 我只會在會話中保存臨時文件的路徑。 當transaciton完成后,將其移動到適當的位置並進行數據庫插入。

此外,實質上,會話數據無論如何都存儲在磁盤(或數據庫)上,因此您可以保存一次圖像文件,然后在完成后發出移動命令。

我將文件保存到磁盤,您甚至可以使用用戶的會話ID命名。 然后可能會有某種清理腳本作為cron作業運行並刪除從未成功支付過的人的圖像。

如果您嘗試在會話中存儲圖像,那么您做錯了。

上傳文件時,會在$ _FILES數組中為其分配一個臨時名稱。 我不知道這些文件的確切生命周期,但您可能能夠在會話中捕獲該名稱,並在驗證CC之前推遲move_uploaded_file()調用。

或者,您可以先執行CC步驟。

有時我們需要在將數據保存到數據庫之前預覽/確認頁面。 但是確認頁面的圖像文件有點不同。你不能做$_SESSION['s_name'] = $_FILES['f_name']因為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']);

如果您必須保留數據,我建議將其保留為base64_encoded字符串。 您可以直接將base64_encode圖像數據發送到瀏覽器。

如果我處於類似的情況,我寧願保存圖像並在session / db中保存有關圖像的信息。 如果由於某種原因注冊失敗,我將在以后取消鏈接該文件。 偶爾運行cron作業來找到圖像缺失的鏈接。

但我真的建議你堅持第二種選擇,完全避免麻煩。

您可以輕松地將會話中的圖像數據存儲為基本編碼數據。 在生產服務器中,您應該有足夠的RAM。 在放入mongoDB之前,我的應用程序需要多達40MB的4個圖像/應用程序進行更新和更改。 (基本編碼使圖像大小增加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'); ?>"/>

在代碼到達塊結尾后,您可以使用空字符串更新圖像的會話。 典型的情況是更新表單字段並進行驗證,以及用戶想要更改文本時。 您還希望顯示在這些失敗的更新之間上載了哪些圖像。 如果要保存往返(建議),請在會話中保留數據一段時間,並在代碼退出后清空該值。

當您將文件類型放入表單時,您需要使用全局變量 Files

表格.html

 <form action="process.php" method="post" enctype="multipart/form-data"> <label for="picture">Picture:</label> <input type="file" name="picture" id="picture"><br> <input type="submit" name="submit" value="Upload"> </form>

進程.php

 <?php session_start(); //make sure you have created the **upload** directory $filename = $_FILES["picture"]["tmp_name"]; $destination = "upload/". $_FILES["picture"]["name"]; move_uploaded_file($filename, $destination); //save uploaded picture in your directory $_SESSION['user_name6'] = $destination; header('Location: display_picture.php'); ?>

顯示_圖片.php

 <?php session_start(); ?> <div> <img src="<?php echo $_SESSION['user_name6']; ?>" alt="picture"/> </div>

是的,您可以在PHP會話中存儲圖像。 將它作為字符串(即二進制數據)導入PHP,然后將其放入會話中。

您將希望它只有它需要的大小,並且您需要在不需要它時立即刪除它,因為會話中的大量信息會減慢會話啟動速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM