Exemple #1
0
 /**
  * セッションに保存した一時ファイルを出力する
  * @param string $name
  * @return void
  * @access public
  */
 function tmp()
 {
     $size = '';
     $args = func_get_args();
     if (func_num_args() > 1) {
         $size = $args[0];
         $name = $args[1];
     } else {
         $name = $args[0];
     }
     $sessioName = str_replace('.', '_', $name);
     $sessionData = $this->Session->read('Upload.' . $sessioName);
     Configure::write('debug', 0);
     $type = $sessionData['type'];
     $ext = decodeContent($type, $name);
     if (!$ext) {
         $this->notFound();
     }
     $fileInfo = array();
     if (isset($sessionData['imagecopy'][$size])) {
         $fileInfo = $sessionData['imagecopy'][$size];
     } elseif (isset($sessionData['imageresize'])) {
         $fileInfo = $sessionData['imageresize'];
     } else {
         $size = '';
     }
     if (!$size) {
         $data = $this->Session->read('Upload.' . $sessioName . '.data');
     } else {
         if (is_dir(TMP . 'uploads')) {
             mkdir(TMP . 'uploads');
             chmod(TMP . 'uploads', 0777);
         }
         $path = TMP . 'uploads' . DS . $name;
         $file = new File($path, true);
         $file->write($this->Session->read('Upload.' . $sessioName . '.data'), 'wb');
         $file->close();
         $thumb = false;
         if (!empty($fileInfo['thumb'])) {
             $thumb = $fileInfo['thumb'];
         }
         App::import('Vendor', 'Imageresizer');
         $imageresizer = new Imageresizer(APP . 'tmp');
         $imageresizer->resize($path, $path, $fileInfo['width'], $fileInfo['height'], $thumb);
         $data = file_get_contents($path);
         unlink($path);
     }
     if ($ext != 'gif' && $ext != 'jpg' && $ext != 'png') {
         Header("Content-disposition: attachment; filename=" . $name);
     }
     Header("Content-type: " . $type . "; name=" . $name);
     echo $data;
     $this->Session->del('Upload.' . $sessioName);
     exit;
 }
 /**
  * 拡張子を取得する
  * 
  * @param	string $content mimeタイプ
  * @param	string $fileName ファイル名
  * @param	string $expect 期待値
  * @dataProvider decodeContentDataProvider
  */
 public function testDecodeContent($content, $fileName, $expect)
 {
     $result = decodeContent($content, $fileName);
     $this->assertEquals($expect, $result, '正しく拡張子を取得できません');
 }
 /**
  * メールフォームに添付したファイルを開く
  */
 public function admin_attachment()
 {
     $args = func_get_args();
     unset($args[0]);
     $file = implode('/', $args);
     $settings = $this->Message->Behaviors->BcUpload->settings['Message'];
     $filePath = WWW_ROOT . 'files' . DS . $settings['saveDir'] . DS . $file;
     $ext = decodeContent(null, $file);
     $mineType = 'application/octet-stream';
     if ($ext != 'gif' && $ext != 'jpg' && $ext != 'png') {
         Header("Content-disposition: attachment; filename=" . $file);
     } else {
         $mineType = 'image/' . $ext;
     }
     Header("Content-type: " . $mineType . "; name=" . $file);
     echo file_get_contents($filePath);
     exit;
 }
Exemple #4
0
 /**
  * ファイルの拡張子チェック
  * 
  * @param array $check チェック対象データ
  * @param string $ext 許可する拡張子
  */
 public function fileExt($check, $ext)
 {
     $file = $check[key($check)];
     if (!empty($file['name'])) {
         $exts = explode(',', $ext);
         $ext = decodeContent($file['type'], $file['name']);
         if (in_array($ext, $exts)) {
             return true;
         } else {
             return false;
         }
     }
     return true;
 }
Exemple #5
0
 /**
  * ファイル群を保存する
  * 
  * @param Model $model
  * @return boolean
  * @access public
  */
 function saveFiles(&$model)
 {
     $imageExt = array('gif', 'jpg', 'png');
     $serverData = $model->findById($model->id);
     foreach ($this->settings['fields'] as $key => $field) {
         if (empty($field['name'])) {
             $field['name'] = $key;
         }
         if (!empty($model->data[$model->name][$field['name'] . '_delete'])) {
             $file = $serverData[$model->name][$field['name']];
             if (!$this->tmpId) {
                 $this->delFile($model, $file, $field);
                 $model->data[$model->name][$field['name']] = '';
             } else {
                 $model->data[$model->name][$field['name']] = $file;
             }
             continue;
         }
         if (empty($model->data[$model->name][$field['name']]['name']) && !empty($model->data[$model->name][$field['name'] . '_'])) {
             // 新しいデータが送信されず、既存データを引き継ぐ場合は、元のフィールド名に戻す
             $model->data[$model->name][$field['name']] = $model->data[$model->name][$field['name'] . '_'];
             unset($model->data[$model->name][$field['name'] . '_']);
         } elseif (!empty($model->data[$model->name][$field['name'] . '_tmp'])) {
             // セッションに一時ファイルが保存されている場合は復元する
             $this->moveFileSessionToTmp($model, $field['name']);
         } elseif (!isset($model->data[$model->name][$field['name']]) || !is_array($model->data[$model->name][$field['name']])) {
             continue;
         }
         if (!empty($model->data[$model->name][$field['name']]) && is_array($model->data[$model->name][$field['name']])) {
             if ($model->data[$model->name][$field['name']]['size'] == 0) {
                 unset($model->data[$model->name][$field['name']]);
                 continue;
             }
             // 拡張子を取得
             $field['ext'] = decodeContent($model->data[$model->name][$field['name']]['type'], $model->data[$model->name][$field['name']]['name']);
             /* タイプ別除外 */
             if ($field['type'] == 'image') {
                 if (!in_array($field['ext'], $imageExt)) {
                     unset($model->data[$model->name][$field['name']]);
                     continue;
                 }
             } else {
                 if (is_array($field['type'])) {
                     if (!in_array($field['ext'], $field['type'])) {
                         unset($model->data[$model->name][$field['name']]);
                         continue;
                     }
                 } else {
                     if ($field['type'] != 'all' && $field['type'] != $field['ext']) {
                         unset($model->data[$model->name][$field['name']]);
                         continue;
                     }
                 }
             }
             if (empty($model->data[$model->name][$field['name']]['name'])) {
                 /* フィールドに値がない場合はスキップ */
                 unset($model->data[$model->name][$field['name']]);
                 continue;
             } else {
                 /* アップロードしたファイルを保存する */
                 // ファイル名が重複していた場合は変更する
                 $model->data[$model->name][$field['name']]['name'] = $this->getUniqueFileName($model, $field['name'], $model->data[$model->name][$field['name']]['name'], $field);
                 // 画像を保存
                 $fileName = $this->saveFile($model, $field);
                 if ($fileName) {
                     if (!$this->tmpId && ($field['type'] == 'all' || $field['type'] == 'image') && !empty($field['imagecopy']) && in_array($field['ext'], $imageExt)) {
                         /* 画像をコピーする */
                         foreach ($field['imagecopy'] as $copy) {
                             // コピー画像が元画像より大きい場合はスキップして作成しない
                             $size = $this->getImageSize($this->savePath . $fileName);
                             if ($size && $size['width'] < $copy['width'] && $size['height'] < $copy['height']) {
                                 if (isset($copy['smallskip']) && $copy['smallskip'] === false) {
                                     $copy['width'] = $size['width'];
                                     $copy['height'] = $copy['height'];
                                 } else {
                                     continue;
                                 }
                             }
                             $copy['name'] = $field['name'];
                             $copy['ext'] = $field['ext'];
                             $ret = $this->copyImage($model, $copy);
                             if (!$ret) {
                                 // 失敗したら処理を中断してfalseを返す
                                 return false;
                             }
                         }
                     }
                     // 一時ファイルを削除
                     @unlink($model->data[$model->name][$field['name']]['tmp_name']);
                     // フィールドの値をファイル名に更新
                     if (!$this->tmpId) {
                         $model->data[$model->name][$field['name']] = $fileName;
                     } else {
                         $model->data[$model->name][$field['name']]['session_key'] = $fileName;
                     }
                 } else {
                     // 失敗したら処理を中断してfalseを返す
                     return false;
                 }
             }
         }
     }
     return true;
 }
 /**
  * メール表示用のデータを出力する
  *
  * @param string $type コントロールタイプ
  * @param mixed $value 変換前の値
  * @param array|string $options コントロールソース
  * @return string メール用データ
  */
 public function toDisplayString($type, $value, $options = "")
 {
     // コントロールソースの配列変換
     if (!is_array($options)) {
         $options = explode("|", $options);
     }
     $options = am(array(0 => ""), $options);
     switch ($type) {
         case 'text':
         case 'textarea':
         case 'email':
         case 'hidden':
             return $value;
         case 'radio':
         case 'select':
             if (isset($options[$value])) {
                 return $options[$value];
             }
             return '';
         case 'pref':
             $options = $this->prefList();
             if (isset($options[$value])) {
                 return $options[$value];
             }
             return '';
         case 'check':
             if (!$options) {
                 return $value;
             }
             if (isset($options[$value])) {
                 return $options[$value];
             }
             return '';
         case 'multi_check':
             if (empty($value)) {
                 return '';
             }
             if (!is_array($value)) {
                 $value = explode("|", $value);
             }
             $out = '';
             foreach ($value as $key => $data) {
                 if ($key != 0) {
                     $out .= " ";
                 }
                 if (isset($options[$data])) {
                     $out .= "・" . $options[$data] . PHP_EOL;
                 }
             }
             return $out;
         case 'file':
             if (empty($value)) {
                 return '';
             }
             $mailContent = $this->_View->get('mailContent');
             $aryFile = explode('/', $value);
             $file = $aryFile[count($aryFile) - 1];
             $ext = decodeContent(null, $file);
             $link = array_merge(array('admin' => true, 'controller' => 'mail_messages', 'action' => 'attachment', $mailContent['MailContent']['id']), $aryFile);
             if (in_array($ext, array('gif', 'jpg', 'png'))) {
                 return $this->BcBaser->getLink($this->BcBaser->getImg($link, array('width' => 400)), $link, array('target' => '_blank'));
             }
             return $this->BcBaser->getLink($file, $link);
         case 'date_time_calender':
             if (is_array($value)) {
                 $value = $this->dateTime($value);
             }
             if ($value) {
                 return date('Y年 m月 d日', strtotime($value));
             }
             return '';
         case 'date_time_wareki':
             if (!is_array($value)) {
                 $value = $this->BcTime->convertToWarekiArray($value);
             }
             return $this->dateTimeWareki($value);
         case 'autozip':
             if (strlen($value) == 7) {
                 return substr($value, 0, 3) . '-' . substr($value, 3, 7);
             }
             return $value;
         default:
             return $value;
     }
 }
 /**
  * ファイルへのリンクを取得する
  *
  * @param string $fieldName
  * @param array $options
  * @return string
  */
 public function fileLink($fieldName, $options = array())
 {
     $options = array_merge(array('imgsize' => 'medium', 'rel' => '', 'title' => '', 'link' => true, 'force' => false, 'width' => '', 'height' => ''), $options);
     extract($options);
     if (strpos($fieldName, '.') === false) {
         throw new BcException('BcUploadHelper を利用するには、$fieldName に、モデル名とフィールド名をドットで区切って指定する必要があります。');
     }
     $this->setEntity($fieldName);
     $field = $this->field();
     $tmp = false;
     $Model = ClassRegistry::init($this->model());
     try {
         $settings = $this->getBcUploadSetting();
     } catch (BcException $e) {
         throw $e;
     }
     $basePath = '/files/' . str_replace(DS, '/', $settings['saveDir']) . '/';
     if (empty($options['value'])) {
         $value = $this->value($fieldName);
     } else {
         $value = $options['value'];
     }
     if (is_array($value)) {
         if (empty($value['session_key']) && empty($value['name'])) {
             $data = $Model->findById($Model->id);
             if (!empty($data[$Model->alias][$field])) {
                 $value = $data[$Model->alias][$field];
             } else {
                 $value = '';
             }
         } else {
             if (isset($value['session_key'])) {
                 $tmp = true;
                 $value = str_replace('/', '_', $value['session_key']);
                 $basePath = '/uploads/tmp/';
             } else {
                 return false;
             }
         }
     }
     /* ファイルのパスを取得 */
     /* 画像の場合はサイズを指定する */
     if (isset($settings['saveDir'])) {
         if ($value && !is_array($value)) {
             $uploadSettings = $settings['fields'][$field];
             $ext = decodeContent('', $value);
             if ($uploadSettings['type'] == 'image' || in_array($ext, $Model->Behaviors->BcUpload->imgExts)) {
                 $options = array('imgsize' => $imgsize, 'rel' => $rel, 'title' => $title, 'link' => $link, 'force' => $force, 'width' => $width, 'height' => $height);
                 if ($tmp) {
                     $options['tmp'] = true;
                 }
                 $fileLinkTag = $this->uploadImage($fieldName, $value, $options) . '<br /><span class="file-name">' . mb_basename($value) . '</span>';
             } else {
                 $filePath = $basePath . $value;
                 $fileLinkTag = $this->Html->link('ダウンロード ≫', $filePath, array('target' => '_blank')) . '<br /><span class="file-name">' . mb_basename($value) . '</span>';
             }
         } else {
             $fileLinkTag = $value;
         }
     } else {
         return false;
     }
     return $fileLinkTag;
 }