2012-03-14 42 views
3

我們在PHP應用程序內部使用Zend_Form來構建輸入文件html元素。我們可以設置這個元素的'目標',當調用receive()時,文件將被保存到指定的位置。PHP使用Zend_Form作爲字節數組接收文件

我們希望能夠將文件保存爲光盤,但是將文件作爲字節數組抓取並使用它做其他事情。

這可能嗎?如果Zend_Form()不可行,是否可以通過其他方式完成?

編輯:我們無法寫入光盤的原因是因爲應用程序在Azure上運行,而且它似乎沒有任何位置的寫入訪問權限,甚至沒有在臨時文件夾中。我們從Zend那裏得到一個例外說'給定的目的地不可寫'。

+0

是至少將它保存在臨時目錄中的一個選項? – 2012-03-14 21:13:15

+0

不,它不是。我們無法保存到光盤上的任何位置。 – 2012-03-15 05:58:45

回答

1

無論使用Zend或不使用Zend,所有的PHP上傳都會寫入文件系統(請參見upload_tmp_dirPOST method uploads)。

文件將默認存儲在服務器的默認臨時 目錄,除非另一個位置已經php.ini被賦予與 upload_tmp_dir指令。

而不是使用receive來處理上載,請嘗試直接使用$_FILES陣列這將讓你文件讀入到使用file_get_contents()或類似功能的串訪問它的。但是,您仍然可以使用Zend_Form來創建和處理一般的表單。

您可以設置共享內存upload_tmp_dir將文件系統映射到存儲上傳文件的內存。請謹慎對待,如果有人試圖上傳一個非常大的文件,它會進入內存,這可能會影響性能或服務成本。

最後,Zend_File_Transfer_Adapter_Http::receive()調用move_uploaded_file()將文件從其臨時位置移動到永久位置。此外,它確保上傳有效並對其進行過濾,並將其標記爲已收到,因此無法再次移動(因爲這會失敗)。

2

唯一看起來可行的方法是使用php://memory協議保存文件。

我從來沒有理由實現,但它看起來很簡單,因爲將文件的保存位置設置爲php://memory這裏是指向手冊頁PHP I/O Wrappers的鏈接。