.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

.オンライン状況
24 人のユーザが現在オンラインです。 (23 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 24

もっと...

.
.リンク集

メイン
   一般的な話題(General)
     CakePHP1.2でのファイルアップロードの定石を教えて下さい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
nishimura
投稿日時: 2009-11-3 3:41
Baker スタート
登録日: 2009-10-18
居住地:
投稿: 16
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい
引用:

MASA-Pさんは書きました:
echo $medium->embed('filter/'.$filter.'/'.$pic['dirname'].'/'.$pic['basename']);


なるほど。そういう方法もあるのですか。
ファイルパスを直接指定している感じですね。
nishimura
投稿日時: 2009-11-3 3:44
Baker スタート
登録日: 2009-10-18
居住地:
投稿: 16
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい
>slywalkerさん
詳しい解説ありがとうございます。勉強になります!

$post['Attachment'][0]は定義されていないので、$this->data['Attachment'][0] としましたが
$this->data['Attachment'] の中を見てみたところ、以下のようになっていました。

array (
  0 =>
  array (
  ),
  1 =>
  array (
    'id' => '1',
    'model' => 'Post',
    'foreign_key' => '1',
    'dirname' => 'transfer/img',
    'basename' => 'logo.jpg',
    'checksum' => 'dae9c4cebc146316b1248fe3b9243f02',
    'alternative' => '',
    'group' => 'attachment',
    'created' => '2009-11-02 01:36:28',
    'modified' => '2009-11-02 01:36:28',
  ),
)

ですので、以下のようにすることで画像を表示することが出来ました。
ありがとうございます><

<?php
echo $medium->embed($medium->file('filter/s'$post['Attachment'][1]));
?>


いろいろ試しているうちに、参考にしたサイトと自分のデータがずれてしまっていたようです。
nishimura
投稿日時: 2009-11-3 23:14
Baker スタート
登録日: 2009-10-18
居住地:
投稿: 16
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい
Media Plugin を使ってみて、またわからないことが出てきてしまいました。

・attachemntをカスタマイズする場合、APP/plugins/media/views/elements/attachments.ctp を
直接編集すれば良いのでしょうか?

・1つのページで複数のアップロードフォームを設置する場合、どのようにすれば良いのでしょうか?
(1つのフォームでアップロード出来るファイル数は1つの場合)

・同じページでも、ログインしている人が違う場合などでは、どのようにファイルを区別すれば良いのでしょうか?


CakePHP自体もまだ慣れているわけでは無いので、おかしなことを質問しているのかもしれませんが
どうか教えていただけませんでしょうか?
hide99
投稿日時: 2009-11-4 3:02
一人前
登録日: 2007-7-2
居住地:
投稿: 107
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい
こんばんわ。躓くところ一緒ですね。

とりあえず僕がわかる範囲で。


・attachemntをカスタマイズする場合、APP/plugins/media/views/elements/attachments.ctp を
直接編集すれば良いのでしょうか?


直接編集でいいんじゃないでしょうか。とりあえず僕が今できるようになったのは画像削除するくらいですね。


・1つのページで複数のアップロードフォームを設置する場合、どのようにすれば良いのでしょうか?
(1つのフォームでアップロード出来るファイル数は1つの場合)


僕もわからないです。一回適当にいじってたらできたのですが、またできなくなってしまってそれから放置です。できたら5個くらい一気にアップロードできるようにしたいですよね。


・同じページでも、ログインしている人が違う場合などでは、どのようにファイルを区別すれば良いのでしょうか?


foreign_key フィールドで判別します。

つまり id 10 のユーザーが登録したときに、foreign_key も 10で登録されるようにする。

また、madiapluginのすげーと思ったところは alternative や groupフィールドでどの用途のファイルをアップロードしたかってのがわかるのがいいですね。

わからないことだらけで申し訳ないですけど。
少しでも情報が増えれば。
slywalker
投稿日時: 2009-11-4 10:35
Baker ユーザ
登録日: 2007-1-8
居住地: 日本 大阪
投稿: 28
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい
引用:
・attachemntをカスタマイズする場合、APP/plugins/media/views/elements/attachments.ctp を
直接編集すれば良いのでしょうか?


自分の場合は、元のプラグインに手を加えたくないので、
いったん
app/views/elements/attachments.ctp とコピーした上で変更してます。
呼び出しは
echo $this->element('attachments');

ちなみにModelの場合も同様で
app/models/attachment.php とコピーして変更してます。

あとの2点については、私もやってみてないのでうまくいったらまたレポートしてもらえたらうれしいです
hide99
投稿日時: 2009-11-7 16:20
一人前
登録日: 2007-7-2
居住地:
投稿: 107
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい
複数ファイルのアップロードができました。

attachments.ctp element 一枚でやろうとするとどうしてもバグるので
・uploads.ctp
・del.ctp

の両方を作ることで解決しました。

contoroller

<?php
//ファイルアップロード
    //アップロードをいくつもつくるのはだるいので、 alternative で判断し、モデルは全てユーザーに統一
    //携帯版、PC版とも写真は一枚ずつアップロードしてください
    /*
        @params str $alternative 写真の種類
    */
    
function upload($alternative 'user')
    {
        if(!empty(
$this->data)){

            
$this->User->set($this->data);

            if (
$this->User->saveAll($this->data)) {
                
$this->Session->setFlash('更新しました');        
                
$this->redirect('/users/upload/');
            } else {
                
$this->Session->setFlash('アップロードできません');
            }
        }
        
        
//削除する画像を指定
        
$data $this->User->find(array('id' =>  $this->Auth->user('id')));
        foreach(
$data['Attachment'] as $v){        
            if(
$v['alternative'] == $alternative){
                
$this->data['Attachment'][] = $v;
            }
        }
        
        
$this->set(
            
compact(
                
'alternative'
            
)
        );
        
    }
?>



view

<?php
<h1>ファイルをアップロード (画像をアップロードする) </h1>
<?
php
$session
->flash();
echo 
$form->create('User', array('type' => 'file''url'=> "/users/upload/"));
echo 
$form->input('User.id',array('type' => 'hidden','value' => $user['User']['id']));
echo 
$this->element('uploads', array('plugin' => 'media','alternative' => $alternative,'count' => 5));//alternative で何の写真かを指定
echo $form->end('submit');
?>


<h1>画像を削除する</h1>
<?php
echo $form->create('User', array('type' => 'file''url'=> "/users/upload/"));
echo 
$form->input('User.id',array('type' => 'hidden','value' => $user['User']['id']));
echo 
$this->element('del', array('plugin' => 'media','alternative' => $alternative));//alternative で何の写真かを指定
echo $form->end('submit');
?>
?>



でもってエレメント。
以下をコピペすればそのまま動くと思います。

アップロードするときに呼び出すエレメント
uploads.ctp

<?php
/**
 * uploads File
 *
 * Element listing associated attachments of the view's model
 * Add an Attachment
 *
 * Copyright (c) 2007-2009 David Persson
 *
 * Distributed under the terms of the MIT License.
 * Redistributions of files must retain the above copyright notice.
 *
 * PHP version 5
 * CakePHP version 1.2
 *
 * @package    media
 * @subpackage media.views.elements
 * @copyright  2007-2009 David Persson <davidpersson@gmx.de>
 * @license    http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link       http://github.com/davidpersson/media
 */

if (!isset($count)) {
    
$count 1;
}

if (!isset(
$previewVersion)) {
    
$previewVersion 's';
}

if (!isset(
$alternative)) {
    
$alternative '';
}

/* Set $assocAlias and $model if you're using this element multiple times in one form */

if (!isset($assocAlias)) {
    
$assocAlias 'Attachment';
} else {
    
$assocAlias Inflector::singularize($assocAlias);
}

if (!isset(
$model)) {
    
$model $form->model();
}

$modelId $form->value($form->model().'.id');

if (isset(
$this->data[$assocAlias][0]['basename'])) {
    
array_unshift($this->data[$assocAlias],array());
}
?>
<div class="attachments element">
    <?php printf(__('%s'true), Inflector::pluralize($assocAlias)) ?>
    <!-- New Attachment -->
    <div class="new">
    <?php
        
        $i 
0;
        while(
$count $i){
            
                echo 
$form->hidden($assocAlias '.'.$i.'.model', array('value' => $model));
                echo 
$form->hidden($assocAlias '.'.$i.'.group', array('value' => strtolower($assocAlias)));
                echo 
$form->input($assocAlias '.'.$i.'.file', array(
                    
'label' => __('File'true),
                    
'type'  => 'file',
                    
'error' => array(
                        
'error'      => __('An error occured while transferring the file.'true),
                        
'resource'   => __('The file is invalid.'true),
                        
'access'     => __('The file cannot be processed.'true),
                        
'location'   => __('The file cannot be transferred from or to location.'true),
                        
'permission' => __('Executable files cannot be uploaded.'true),
                        
'size'       => __('The file is too large.'true),
                        
'pixels'     => __('The file is too large.'true),
                        
'extension'  => __('The file has the wrong extension.'true),
                        
'mimeType'   => __('The file has the wrong MIME type.'true),
                )));
                echo 
$form->input($assocAlias '.'.$i.'.alternative', array(
                    
'label' => __('Textual replacement'true),
                    
'value' => $alternative,
                    
'error' => __('A textual replacement must be provided.'true),
                    
'type' => 'hidden'//09.10.20修正
                
));
            
            
$i++;
        }
    
?>
    </div>
    <!-- Existing Attachments -->
</div>
?>




画像を削除したいときに呼び出すエレメント

del.ctp

<?php
/**
 * del File
 *
 * Element listing associated attachments of the view's model
 * Add an Attachment
 *
 * Copyright (c) 2007-2009 David Persson
 *
 * Distributed under the terms of the MIT License.
 * Redistributions of files must retain the above copyright notice.
 *
 * PHP version 5
 * CakePHP version 1.2
 *
 * @package    media
 * @subpackage media.views.elements
 * @copyright  2007-2009 David Persson <davidpersson@gmx.de>
 * @license    http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link       http://github.com/davidpersson/media
 */
 
if (!isset($previewVersion)) {
    
$previewVersion 's';
}

if (!isset(
$alternative)) {
    
$alternative '';
}

/* Set $assocAlias and $model if you're using this element multiple times in one form */

if (!isset($assocAlias)) {
    
$assocAlias 'Attachment';
} else {
    
$assocAlias Inflector::singularize($assocAlias);
}

if (!isset(
$model)) {
    
$model $form->model();
}

$modelId $form->value($form->model().'.id');

if (isset(
$this->data[$assocAlias][0]['basename'])) {
    
array_unshift($this->data[$assocAlias],array());
}
?>
<!-- Existing Attachments -->
    
    <div class="existing">
    <?php if (isset($this->data[$assocAlias])): ?>
        <?php for($i 1$i count($this->data[$assocAlias]); $i++): ?>
        <div>
        <?php
        
            $item 
$this->data[$assocAlias][$i];

            echo 
$form->hidden($assocAlias '.' $i '.id', array('value' => $item['id']));
            echo 
$form->hidden($assocAlias '.' $i '.model', array('value' => $model));
            echo 
$form->hidden($assocAlias '.' $i '.group', array('value' => $item['group']));
            echo 
$form->hidden($assocAlias '.' $i '.dirname', array('value' => $item['dirname']));
            echo 
$form->hidden($assocAlias '.' $i '.basename', array('value' => $item['basename']));
            echo 
$form->hidden($assocAlias '.' $i '.alternative', array('value' => $item['alternative']));
            
            
            echo 
$medium->embed($medium->file('filter/s'$item));
            
            echo 
$form->input($assocAlias '.' $i '.delete', array(
                
'label' => __('削除'true),
                
'type' => 'checkbox',
                
'value' => 0
            
));
        
?>
        </div>
        <?php endfor ?>
    <?php endif ?>
    </div>
?>



です。
jyokyoku
投稿日時: 2009-12-8 20:55
Baker スタート
登録日: 2008-2-16
居住地:
投稿: 14
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい
こちらのスレッドを参考にMediaプラグインを利用してみました。
利用したのはリポジトリから持ってきた最新(0.60beta?)です。

ファイルのアップロードに関しては文句なく便利ですね。
他のモデルとの連携もスムーズで、
自力で開発しようと思っていたところだったのでとても重宝しています。


ただ、複数ファイルのアップロードの部分を実装していて気づいたのですが、
アップロードフォームの中に一つでもバリデーションエラーが発生すると、
アップロードを行わなかった全てのフォームに、同様のエラーの表示がされてしまいませんか?

全てのアップロードフォームにファイルを指定した場合は問題無いのですが、
1つでも空のアップロードフォームが存在すると、
他のアップロードフォームで発生したエラーが表示されてしまうんですよね・・。


自分の環境だけだったらとても恐縮なのですが、
同じような現象が発生していらっしゃる方いますでしょうか?


とりあえずTransferBehaviorのbeforeValidate関数の最初で、
$this->reset($Model);
を呼んで解決することはしているのですが、
何か不都合がでないか少々心配ではあります・・。
hide99
投稿日時: 2009-12-9 4:52
一人前
登録日: 2007-7-2
居住地:
投稿: 107
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい
今、アップロードファイルを5個に設定してますが問題なく動いていますね。

validateする前に

「空の$_FILESがあれば削除」

をすればいいんじゃないでしょうか。
jyokyoku
投稿日時: 2009-12-9 10:49
Baker スタート
登録日: 2008-2-16
居住地:
投稿: 14
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい
ご回答ありがとうございます。

引用:

hide99さんは書きました:
今、アップロードファイルを5個に設定してますが問題なく動いていますね。

validateする前に

「空の$_FILESがあれば削除」

をすればいいんじゃないでしょうか。


おー、確かにその通りだと思いまして、
空の$_FILESを削除してみたらエラーの表示も無くなりました。


ちなみに複数アップロードの際は、
やはり空の$_FILESを削除されておりますか?

何もなしに動いているようであれば、なんだか気持ち悪いので、
ちょっと自分の環境を洗ってみたいと思います。
morygonz
投稿日時: 2010-2-5 16:41
Baker スタート
登録日: 2010-1-20
居住地:
投稿: 3
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい
お世話になります。

CakePHP 1.2.6、MediaPlugin 0.6で複数ファイルのアップロードを実装しようとしています。空のフォームがあるときに出るエラーでうまくいっていないのですが、

引用:
validateする前に

「空の$_FILESがあれば削除」

をすればいいんじゃないでしょうか。


とは具体的にどういう風にすれば良いのでしょうか。 $_FILES の各配列をチェックし、空のものがあれば unset() するのかなとは思うのですが、どのファイルのどこのタイミングで処理すれば良いのかが分かりません。「validateする前」とはどこでのvalidationを指すのでしょうか? よろしければお教え下さい。

よろしくお願いいたします。
« 1 (2) 3 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .