/** * セッションに保存した一時ファイルを出力する * @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; }
/** * ファイルの拡張子チェック * * @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; }
/** * ファイル群を保存する * * @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; }