2014-03-04 128 views
0

上傳文件時,通常會爲該字段創建一個數組。例如,在其中該模型是文獻和現場的情況下是submittedfileCakePHP:使用擴展數據陣列將文件字段保存到數據庫

$this->request->data['Document']['submittedfile'] = array(
'name' => 'conference_schedule.pdf', 
'type' => 'application/pdf', 
'tmp_name' => 'C:/WINDOWS/TEMP/php1EE.tmp', 
'error' => 0, 
'size' => 41737, 
); 

陣列不能被保存到DB,因爲該字段不能保存「submittedfile」陣列到DB '已提交文件'列。不過我只需要在提交文件字段DB的上述數組的名稱部分。嘗試了多種方法這裏有兩個:

開啓submittedfile從數組字符串在控制器方法調用控制器Methdod保存方法之前。

public function addDocument(){ 
$this->request->data['Document']['submittedfile'] = $this->request->data['Document']['submittedfile']['name']; 
$this->Document->save($this->request->data);} 

轉動submittedfile從陣列到串在beforeSave回調方法調用之前(問題不能使用CakePHP驗證用於檔案大小和uploadError時,因爲它們需要[「tmp_name的值」]工作。)在控制器方法中保存方法。 (問題是,我得到錯誤非法串偏移「名」

public function beforeSave($options = array()){ 
$this->data['Document']['submittedfile'] = $this->data['Document']['submittedfile']['name'];} 

任何保存上傳的文件類型數組到DB的答案?

回答

0

如果您想要保存該陣列,可以使用store it as JSONserialized array

有一個關於每個人here

關於你提到的兩種解決方案的優點的討論,也許第二個是更好的。

beforeSave內,請debug($this->data);清楚地看到你做了什麼,以及如何訪問'name'

你是如何處理的文件上傳?應該分開處理:使用隨機名稱上載文件並將該名稱存儲在數據庫中。

+0

我正在使用調試,因爲你建議發現它給了以下內容。 – DaGambit

+0

我沒有看到代碼 – cornelb

+0

我按照你的建議使用了調試,但它給了我陣列結構。它表明使用'$ this-> data ['Document'] ['submittedfile'] ['name']'應該返回正確的值。因爲如果我回顯'$ this-> data ['Document'] ['submittedfile'] ['name'],這個問題似乎與'$ this-> data ['Document'] ['submittedfile']' ]該值顯示沒有**非法偏移錯誤**。特德發現它給了以下內容。 – DaGambit

0

我不確定你會用db中的名字做什麼,你也需要上傳文件。

使用此:Uploader

0

問題:多個保存的方法,所使用的不同$this->data陣列控制器。試圖簡化發佈的代碼並從代碼中找出問題。未顯示的原始代碼包含兩個在adddocument()控制器內調用的save()方法,其中一個沒有傳遞給它的$this->data['Document']['submittedfile']['name']。這引起了非法串偏移誤差

提示1(推薦):

使用isset()函數來檢查變量存在試圖操縱它在beforeSave()之前方法:

public function beforeSave($options=array()) 
{ 
    if(isset($this->data['Document']['submittedfile']['name'])) 
    {$this->data['Document']['submittedfile'] = $this->data['Document']['submittedfile']['name']; 
    } 
    return true; 
} 

提示2

禁用回調(即beforeSave,afterValidate等)被控制器中的其他保存方法調用。如果這些節省不要求他們的數據beforeSave的操作:

$this->Document->saveField('submittedfile', $yourvalue, array('callbacks'=>false)) 

感謝所有那些花時間幫我@cornelb和@skywalker。