2011-10-06 57 views

回答

-1

PHP會議是由PHP的內存使用量限制的限制。所以10MB可能會好,但...

我不認爲「會議」是存儲大型二進制數據的正確選擇。上傳的文件將轉到服務器上的臨時文件夾,您可以在該目錄中找到它們一段時間。因此,如果您需要稍後訪問該文件,則可以將臨時文件路徑簡單地存儲到會話中。

示例代碼:

session_start(); 
$_SESSION["uploaded_file"] = $_FILES["file"]; 

然後,當你需要這個文件複製到真正的路徑,你可以這樣做:

move_uploaded_file($_SESSION["uploaded_file"]["tmp_name"], "images/".$_SESSION["uploaded_file"]["name"]); 

您也可以達到「類型」,「如果你需要它們,可以從$ _SESSION [「uploaded_file」]中找到「size」和「error」項。

+0

'如果您需要稍後訪問該文件,則可以簡單地將臨時文件路徑存儲到會話中。「 - 呃,真的嗎? –

+1

-1這是錯誤的。臨時文件在請求結束時被刪除,因此您不能在會話中存儲它們的路徑並在稍後移動它。 – Artefacto

+0

你是對的,我的錯誤。我在cron作業腳本中做了類似的事情。當然php會話持續了一段時間。請更改接受的答案。抱歉。 –

1

我不認爲除PHP可用的內存外沒有任何限制。但是,在會話中存儲大文件將導致不必要的延遲,因爲會話對象必須在每個請求結束時的非序列化開始時反序列化(除非您未加載會話的那些請求除外)。

您可以改爲將文件保存在臨時位置,並只保存會話中的文件名。

1

您可以將二進制數據存儲在會話變量中,因此根本不需要修改它。會話文件已經(或多或少)被序列化。

或者,您可以base64編碼的圖像數據存儲在會話數據。

話雖如此,這似乎是一個壞主意 - 當會話被加載時(甚至更多,如果你還必須base64解碼它),你會增加更多的服務器負載來編碼/解碼圖像數據,而且你會將整個文件加載到內存中。我會將映像轉儲到臨時文件,而不是將文件的路徑存儲在會話數據中。

0

只要你不超過memory_limit你應該很好地存儲它。

這就是說,這裏是我已經習慣了到會話推送$_FILES的方法,假設:

  • $_SESSION['File']在這裏我們將其存儲
  • $uploadFile在圖像上載(例如參考到$_FILES
  • 你已經建立的會話

if ($uploadFile['error'] == UPLOAD_ERR_OK) 
{ 
    // try reading directly from temp directory 
    if (is_readable($uploadFile['tmp_name'])) 
    { 
    $_SESSION['File'] = file_get_contents($uploadFile['tmp_name']); 
    } 
    // not readable as-is, make sure we can move it 
    else 
    { 
    $moveTo = 'uploads' . DIRECTORY_SEPARATOR . $uploadFile['name']; 
    if (is_writeable(dirname($moveTo)) && move_uploaded_file($uploadFile['tmp_name'],$moveTo) !== false) 
    { 
     // read now that its been moved 
     $_SESSION['File'] = file_get_contents($moveTo); 

     // cleanup 
     @unlink($moveTo); 
    } 
    } 
} 

否則,如果一切都失敗了,這是不能夠被保存在session