2013-01-08 58 views
2

我從Android上傳圖像到PHP服務器。文件上傳正確,但是當我嘗試將文件移動到另一個目錄時,它會給出錯誤。我在Win7上使用WAMP中的CakePHP。我在php.ini中設置file_uploads =在PHP中的beforeSave()錯誤,而cakePhp中的move_uploaded_file錯誤

PHP代碼:

if ($this->request->is('post') && !empty($this->request->data)) { 
    $base=$_REQUEST['image'];  

// base64 encoded utf-8 string  
    $binary=base64_decode($base); 

// binary, utf-8 bytes  
    header('Content-Type: bitmap; charset=utf-8'); 

    $filename = $this->request->data['name']; 
    pr($filename); 

    $folder_URL = 'C:\wamp\tmp\\' . $filename; 

    pr($folder_URL); 

    $file = fopen($folder_URL, 'wb'); 

    //write to file 
    fwrite($file, $binary); 

    fclose($file); 

    $url = 'C:\wamp\www\moccv\app\webroot\img\profile_pics\arora.jpg'; 
    $success = move_uploaded_file($folder_URL, $url); 

    if ($success) { 
     pr('image uploaded successfully'); 
    } else { 
     pr('could not upload image'); 
     print_r(error_get_last()); 
    } 

}   

輸出 -

arora.jpg 
C:\wamp\tmp\arora.jpg 
could not upload image 
Array([type] => 2048 [message] => Declaration of SluggableBehavior::beforeSave() should be compatible with that of ModelBehavior::beforeSave() [file] => C:\wamp\www\moccv\app\Plugin\Sluggable\Model\Behavior\SluggableBehavior.php [line] => 23) 

PHP代碼:SluggableBehavior.php

<?php 
/* SVN FILE: $Id: sluggable.php 36 2007-11-26 15:10:14Z mgiglesias $ */ 

/** 
* Sluggable Behavior class file. 
* 
* @filesource 
* @author Mariano Iglesias 
* @link http://cake-syrup.sourceforge.net/ingredients/sluggable-behavior/ 
* @version $Revision: 36 $ 
* @license http://www.opensource.org/licenses/mit-license.php The MIT License 
* @package app 
* @subpackage app.models.behaviors 
*/ 

/** 
* Model behavior to support generation of slugs for models. 
* 
* @package app 
* @subpackage app.models.behaviors 
*/ 
class SluggableBehavior extends ModelBehavior 
{ 
    /** 
    * Contain settings indexed by model name. 
    * 
    * @var array 
    * @access private 
    */    
    var $__settings = array(); 

/** 
* Initiate behavior for the model using specified settings. Available settings: 
* 
* - label:  (array | string, optional) set to the field name that contains the 
*     string from where to generate the slug, or a set of field names to 
*     concatenate for generating the slug. DEFAULTS TO: title 
* 
* - slug:  (string, optional) name of the field name that holds generated slugs. 
*     DEFAULTS TO: slug 
* 
* - separator: (string, optional) separator character/string to use for replacing 
*     non alphabetic characters in generated slug. DEFAULTS TO: - 
* 
* - length: (integer, optional) maximum length the generated slug can have. 
*     DEFAULTS TO: 100 
* 
* - overwrite: (boolean, optional) set to true if slugs should be re-generated when 
*     updating an existing record. DEFAULTS TO: false 
* 
* @param object $Model Model using the behaviour 
* @param array $settings Settings to override for model. 
* @access public 
*/ 
function setup(&$Model, $settings = array()) 
{ 
    $default = array('label' => array('title'), 'slug' => 'slug', 'separator' => '-', 'length' => 100, 'overwrite' => false, 'translation' => null); 

    if (!isset($this->__settings[$Model->alias])) 
    { 
     $this->__settings[$Model->alias] = $default; 
    } 

    //$this->__settings[$Model->alias] = am($this->__settings[$Model->alias], ife(is_array($settings), $settings, array())); 
    if (is_array($settings)) { 
     $retSettings = $settings; 
    } else { 
     $retSettings = array(); 
    } 
    //pr($retSettings); 

    $this->__settings[$Model->alias] = am(
     $this->__settings[$Model->alias], 
     $retSettings 
    ); 

} 

/** 
* Run before a model is saved, used to set up slug for model. 
* 
* @param object $Model Model about to be saved. 
* @return boolean true if save should proceed, false otherwise 
* @access public 
*/ 
function beforeSave(&$Model) 
{ 
    $return = parent::beforeSave($Model); 

    // Make label fields an array 

    if (!is_array($this->__settings[$Model->alias]['label'])) 
    { 
     $this->__settings[$Model->alias]['label'] = array($this->__settings[$Model->alias]['label']); 
    } 

    // Make sure all label fields are available 

    foreach($this->__settings[$Model->alias]['label'] as $field) 
    { 
     if (!$Model->hasField($field)) 
     { 
      return $return; 
     } 
    } 

    // See if we should be generating a slug 

    if ($Model->hasField($this->__settings[$Model->alias]['slug']) && ($this->__settings[$Model->alias]['overwrite'] || empty($Model->id))) 
    { 
     // Build label out of data in label fields, if available, or using a default slug otherwise 

     $label = ''; 

     foreach($this->__settings[$Model->alias]['label'] as $field) 
     { 
      if (!empty($Model->data[$Model->alias][$field])) 
      { 
       if (!empty($label)) { 
        $prepend = ' '; 
       } else { 
        $prepend = ''; 
       } 
       $label .= $prepend . $Model->data[$Model->alias][$field]; 
      } 
     } 

     // Keep on going only if we've got something to slug 

     if (!empty($label)) 
     { 
      // Get the slug 

      $slug = $this->__slug($label, $this->__settings[$Model->alias]); 

      // Look for slugs that start with the same slug we've just generated 

      $conditions = array($Model->alias . '.' . $this->__settings[$Model->alias]['slug'].' LIKE' => $slug . '%'); 

      if (!empty($Model->id)) 
      { 
       $conditions[$Model->alias . '.' . $Model->primaryKey.' !='] = $Model->id; 
      } 

      $result = $Model->find('all', array('conditions' => $conditions, 'fields' => array($Model->primaryKey, $this->__settings[$Model->alias]['slug']), 'recursive' => -1)); 
      $sameUrls = null; 

      if (!empty($result)) 
      { 
       $sameUrls = Set::extract($result, '{n}.' . $Model->alias . '.' . $this->__settings[$Model->alias]['slug']); 
      } 

      // If we have collissions 

      if (!empty($sameUrls)) 
      { 
       $begginingSlug = $slug; 
       $index = 1; 

       // Attach an ending incremental number until we find a free slug 

       while($index > 0) 
       { 
        if (!in_array($begginingSlug . $this->__settings[$Model->alias]['separator'] . $index, $sameUrls)) 
        { 
         $slug = $begginingSlug . $this->__settings[$Model->alias]['separator'] . $index; 
         $index = -1; 
        } 

        $index++; 
       } 
      } 

      // Now set the slug as part of the model data to be saved, making sure that 
      // we are on the white list of fields to be saved 

      if (!empty($Model->whitelist) && !in_array($this->__settings[$Model->alias]['slug'], $Model->whitelist)) 
      { 
       $Model->whitelist[] = $this->__settings[$Model->alias]['slug']; 
      } 

      $Model->data[$Model->alias][$this->__settings[$Model->alias]['slug']] = $slug; 
     } 
    } 

    return $return; 
} 

/** 
* Generate a slug for the given string using specified settings. 
* 
* @param string $string String from where to generate slug 
* @param array $settings Settings to use (looks for 'separator' and 'length') 
* @return string Slug for given string 
* @access private 
*/ 
function __slug($string, $settings) 
{ 
    if (!empty($settings['translation']) && is_array($settings['translation'])) 
    { 
     // Run user-defined translation tables 

     if (count($settings['translation']) >= 2 && count($settings['translation']) % 2 == 0) 
     { 
      for($i=0, $limiti=count($settings['translation']); $i < $limiti; $i+=2) 
      { 
       $from = $settings['translation'][$i]; 
       $to = $settings['translation'][$i + 1]; 

       if (is_string($from) && is_string($to)) 
       { 
        $string = strtr($string, $from, $to); 
       } 
       else 
       { 
        $string = r($from, $to, $string); 
       } 
      } 
     } 
     else if (count($settings['translation']) == 1) 
     { 
      $string = strtr($string, $settings['translation'][0]); 
     } 

     $string = strtolower($string); 
    } 
    else if (!empty($settings['translation']) && is_string($settings['translation']) && in_array(strtolower($settings['translation']), array('utf-8', 'iso-8859-1'))) 
    { 
     // Run pre-defined translation tables 

     $translations = array(
      'iso-8859-1' => array(
       chr(128).chr(131).chr(138).chr(142).chr(154).chr(158) 
       .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194) 
       .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202) 
       .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210) 
       .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218) 
       .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227) 
       .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235) 
       .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243) 
       .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251) 
       .chr(252).chr(253).chr(255), 
       'EfSZsz' . 'YcYuAAA' . 'AAACEEE' . 'EIIIINO' . 'OOOOOUU' . 'UUYaaaa' . 'aaceeee' . 'iiiinoo' . 'oooouuu' . 'uyy', 
       array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254)), 
       array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th') 
      ), 
      'utf-8' => array(
       array(
        // Decompositions for Latin-1 Supplement 
        chr(195).chr(128) => 'A', chr(195).chr(129) => 'A', 
        chr(195).chr(130) => 'A', chr(195).chr(131) => 'A', 
        chr(195).chr(132) => 'A', chr(195).chr(133) => 'A', 
        chr(195).chr(135) => 'C', chr(195).chr(136) => 'E', 
        chr(195).chr(137) => 'E', chr(195).chr(138) => 'E', 
        chr(195).chr(139) => 'E', chr(195).chr(140) => 'I', 
        chr(195).chr(141) => 'I', chr(195).chr(142) => 'I', 
        chr(195).chr(143) => 'I', chr(195).chr(145) => 'N', 
        chr(195).chr(146) => 'O', chr(195).chr(147) => 'O', 
        chr(195).chr(148) => 'O', chr(195).chr(149) => 'O', 
        chr(195).chr(150) => 'O', chr(195).chr(153) => 'U', 
        chr(195).chr(154) => 'U', chr(195).chr(155) => 'U', 
        chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y', 
        chr(195).chr(159) => 's', chr(195).chr(160) => 'a', 
        chr(195).chr(161) => 'a', chr(195).chr(162) => 'a', 
        chr(195).chr(163) => 'a', chr(195).chr(164) => 'a', 
        chr(195).chr(165) => 'a', chr(195).chr(167) => 'c', 
        chr(195).chr(168) => 'e', chr(195).chr(169) => 'e', 
        chr(195).chr(170) => 'e', chr(195).chr(171) => 'e', 
        chr(195).chr(172) => 'i', chr(195).chr(173) => 'i', 
        chr(195).chr(174) => 'i', chr(195).chr(175) => 'i', 
        chr(195).chr(177) => 'n', chr(195).chr(178) => 'o', 
        chr(195).chr(179) => 'o', chr(195).chr(180) => 'o', 
        chr(195).chr(181) => 'o', chr(195).chr(182) => 'o', 
        chr(195).chr(182) => 'o', chr(195).chr(185) => 'u', 
        chr(195).chr(186) => 'u', chr(195).chr(187) => 'u', 
        chr(195).chr(188) => 'u', chr(195).chr(189) => 'y', 
        chr(195).chr(191) => 'y', 
        // Decompositions for Latin Extended-A 
        chr(196).chr(128) => 'A', chr(196).chr(129) => 'a', 
        chr(196).chr(130) => 'A', chr(196).chr(131) => 'a', 
        chr(196).chr(132) => 'A', chr(196).chr(133) => 'a', 
        chr(196).chr(134) => 'C', chr(196).chr(135) => 'c', 
        chr(196).chr(136) => 'C', chr(196).chr(137) => 'c', 
        chr(196).chr(138) => 'C', chr(196).chr(139) => 'c', 
        chr(196).chr(140) => 'C', chr(196).chr(141) => 'c', 
        chr(196).chr(142) => 'D', chr(196).chr(143) => 'd', 
        chr(196).chr(144) => 'D', chr(196).chr(145) => 'd', 
        chr(196).chr(146) => 'E', chr(196).chr(147) => 'e', 
        chr(196).chr(148) => 'E', chr(196).chr(149) => 'e', 
        chr(196).chr(150) => 'E', chr(196).chr(151) => 'e', 
        chr(196).chr(152) => 'E', chr(196).chr(153) => 'e', 
        chr(196).chr(154) => 'E', chr(196).chr(155) => 'e', 
        chr(196).chr(156) => 'G', chr(196).chr(157) => 'g', 
        chr(196).chr(158) => 'G', chr(196).chr(159) => 'g', 
        chr(196).chr(160) => 'G', chr(196).chr(161) => 'g', 
        chr(196).chr(162) => 'G', chr(196).chr(163) => 'g', 
        chr(196).chr(164) => 'H', chr(196).chr(165) => 'h', 
        chr(196).chr(166) => 'H', chr(196).chr(167) => 'h', 
        chr(196).chr(168) => 'I', chr(196).chr(169) => 'i', 
        chr(196).chr(170) => 'I', chr(196).chr(171) => 'i', 
        chr(196).chr(172) => 'I', chr(196).chr(173) => 'i', 
        chr(196).chr(174) => 'I', chr(196).chr(175) => 'i', 
        chr(196).chr(176) => 'I', chr(196).chr(177) => 'i', 
        chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij', 
        chr(196).chr(180) => 'J', chr(196).chr(181) => 'j', 
        chr(196).chr(182) => 'K', chr(196).chr(183) => 'k', 
        chr(196).chr(184) => 'k', chr(196).chr(185) => 'L', 
        chr(196).chr(186) => 'l', chr(196).chr(187) => 'L', 
        chr(196).chr(188) => 'l', chr(196).chr(189) => 'L', 
        chr(196).chr(190) => 'l', chr(196).chr(191) => 'L', 
        chr(197).chr(128) => 'l', chr(197).chr(129) => 'L', 
        chr(197).chr(130) => 'l', chr(197).chr(131) => 'N', 
        chr(197).chr(132) => 'n', chr(197).chr(133) => 'N', 
        chr(197).chr(134) => 'n', chr(197).chr(135) => 'N', 
        chr(197).chr(136) => 'n', chr(197).chr(137) => 'N', 
        chr(197).chr(138) => 'n', chr(197).chr(139) => 'N', 
        chr(197).chr(140) => 'O', chr(197).chr(141) => 'o', 
        chr(197).chr(142) => 'O', chr(197).chr(143) => 'o', 
        chr(197).chr(144) => 'O', chr(197).chr(145) => 'o', 
        chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe', 
        chr(197).chr(148) => 'R',chr(197).chr(149) => 'r', 
        chr(197).chr(150) => 'R',chr(197).chr(151) => 'r', 
        chr(197).chr(152) => 'R',chr(197).chr(153) => 'r', 
        chr(197).chr(154) => 'S',chr(197).chr(155) => 's', 
        chr(197).chr(156) => 'S',chr(197).chr(157) => 's', 
        chr(197).chr(158) => 'S',chr(197).chr(159) => 's', 
        chr(197).chr(160) => 'S', chr(197).chr(161) => 's', 
        chr(197).chr(162) => 'T', chr(197).chr(163) => 't', 
        chr(197).chr(164) => 'T', chr(197).chr(165) => 't', 
        chr(197).chr(166) => 'T', chr(197).chr(167) => 't', 
        chr(197).chr(168) => 'U', chr(197).chr(169) => 'u', 
        chr(197).chr(170) => 'U', chr(197).chr(171) => 'u', 
        chr(197).chr(172) => 'U', chr(197).chr(173) => 'u', 
        chr(197).chr(174) => 'U', chr(197).chr(175) => 'u', 
        chr(197).chr(176) => 'U', chr(197).chr(177) => 'u', 
        chr(197).chr(178) => 'U', chr(197).chr(179) => 'u', 
        chr(197).chr(180) => 'W', chr(197).chr(181) => 'w', 
        chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y', 
        chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z', 
        chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z', 
        chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z', 
        chr(197).chr(190) => 'z', chr(197).chr(191) => 's', 
        // Euro Sign 
        chr(226).chr(130).chr(172) => 'E' 
       ) 
      ) 
     ); 

     return $this->__slug($string, am($settings, array('translation' => $translations[$settings['translation']]))); 
    } 

    $string = strtolower($string); 
    $string = preg_replace('/[^a-z0-9_]/i', $settings['separator'], $string); 
    $string = preg_replace('/' . preg_quote($settings['separator']) . '[' . preg_quote($settings['separator']) . ']*/', $settings['separator'], $string); 

    if (strlen($string) > $settings['length']) 
    { 
     $string = substr($string, 0, $settings['length']); 
    } 

    $string = preg_replace('/' . preg_quote($settings['separator']) . '$/', '', $string); 
    $string = preg_replace('/^' . preg_quote($settings['separator']) . '/', '', $string); 

    return $string; 
} 
} 

?> 
+0

檢查權限 –

+0

如果(!$ success){?php } ?> 使用此代碼並編輯您的問題。因爲它對您收到的錯誤沒有意義。 –

+0

或<?php print_r(error_get_last()); ?>用這個來得到你得到的錯誤。 –

回答

0

您在哪個用戶運行Web服務器?

確保:

  1. 要保存的路徑是否有效
  2. 運行wamp有權限在該文件

嘗試改變路徑,以一些簡單的道路使用者,甚至相對路徑,以及更改目標文件的權限以便所有用戶都可訪問

嘗試添加

error_reporting(E_ALL); 
ini_set("display_errors", 1); 

到您的網頁,並檢查Apache的錯誤日誌的詳細信息

編輯

不知道該錯誤有關,嘗試標記線

$success = move_uploaded_file($folder_URL, $url); 

並檢查錯誤是否仍然顯示。該SluggableBehavior的方法簽名必須是相同的ModelBehavior類的,這意味着beforeSave()方法的方法簽名必須改變來自:

function beforeSave(&$model) 

到:

function beforeSave(Model $model) 

你有沒有嘗試更改路徑並檢查權限?

+0

謝謝Kuf ...我可以顯示錯誤使用代碼。 – asloob

+0

@ user603125答案已更新。 – Kuf

0

在php.ini文件中做出以下更改。

file_uploads = On

如果沒有,然後檢查我在評論中提到的可能的錯誤。
如果仍然沒有檢查文件上傳大小的限制。 如果你正在使用cakephp,那麼下面的代碼將幫助你。

if (is_uploaded_file($this->data['MODEL_NAME']['upload']['tmp_name'])) 
{ 
    $arr = explode('.',$this->data['MODEL_NAME']['upload']['name']); 
    $image_name = time().".".$arr[1]; 

    $dest = APP.WEBROOT_DIR.DS.'img'.DS.'other_file'.DS.$image_name; 
    move_uploaded_file($this->data['MODEL_NAME']['upload']['tmp_name'],$dest); 

    if(DO_CHECK) 
    { 
     /*****************code after success*****************/ 
    } 
}
+0

它看起來像你使用cakephp對不對? –

+0

是的,我正在使用cakephp – asloob

+0

你的模型代碼沒有正確寫出與C:\ wamp \ www \ moccv \ app \ Plugin \ Sluggable \ Model \ Behavior \ SluggableBehavior.php粘貼模型代碼有問題此文件代碼, –

0

我不能評論,所以我回答

我對CakePHP的上傳視頻的一些問題,它竟然是在php.ini「的post_max_size」限制,也可能要檢查「的upload_max_filesize」 。超過限制時,CakePHP中不會顯示任何錯誤消息,並會丟棄$ this-> request-> data的部分內容。

錯誤消息就像@Kuf所說的,由於在saveSave之前用不同的簽名覆蓋了方法。因此,將參數從& $ model更改爲Model $模型應該可以解決這個問題。