旬なCocomoでファイル共有をしてみたよ。

旬なCocomoでファイル共有をしてみました。
http://moeten.info/flex/20081122_cocomoTest2/bin-release/fileShare.html

適当にファイルのアップやダウンロード、削除をしてみてください。
AIRアプリであればドラッグアンドドロップでファイルアップとかできそう。
ファイル共有の手順としては、

  • 1.Cocomoにログイン認証
  • 2.使用するグループがあるかチェック
  • 3.グループにあるファイルリスト取得
  • 4.ファイルの操作(アップ・ダウンロード・削除)

こんな感じ。
グループ処理と権限指定がめんどいけどそれ以外は簡単でっす。

1.Cocomoにログイン認証

<rtc:AdobeHSAuthenticator id="auth" userName="アカウント" password="パスワード" />
<rtc:ConnectSessionContainer roomURL="http://connectnow.acrobat.com/名前/部屋"
    id="myConnectSession" synchronizationChange="synchronizationChangeHandler(event)"
    authenticator="{auth}">

2.使用するグループがあるかチェック

if( !fileManager.isGroupDefined( groupName )
    && fileManager.getUserRole( userManager.myUserID , groupName ) == UserRoles.OWNER )
{

3.グループにあるファイルリスト取得

fileDescriptors = myConnectSession.fileManager.getFileDescriptors(groupName);

4.ファイルの操作(アップ・ダウンロード・削除)

アップ

//ファイルアップロード
private function onUploadClick():void
{
    var filterArray:Array = [new FileFilter("*.jpg", "*.jpg")];
    filePublisher.browse(UIDUtil.createUID(), filterArray);
}

ダウンロード

//ファイルダウンロード
private function onDownloadClick():void
{
    if( myGrid.selectedItem) {
        if( !fileSubscriber ){
            fileSubscriber = new FileSubscriber();
            fileSubscriber.initialize();
        }
        try{
            fileSubscriber.download( myGrid.selectedItem as FileDescriptor );
        }catch(e:Error) {
            trace("Error download: " + e.message);
        }
    }
}

ファイル削除

//ファイル削除
private function onDeleteClick():void
{
    if( myGrid.selectedItem) {
        filePublisher.remove( myGrid.selectedItem as FileDescriptor);
    }
}

どれも実質1行でできるのがとても便利。
ところで、ファイルアップロードしたのはいいけど、ファイルの実際のURLはどこ?って思うと思いますが、以下のような感じで取得することができます。

groupNmae = "mySharedTest";
var mydata:ArrayCollection = myConnectSession.fileManager.getFileDescriptors(groupName);
mydata[0].url + mydata[0].filename + '?mst=hogehoge&amp;token=' + mydata[0].token;

tokenはパスワードに用いるセッションみたいなものだと思います。
mstは現在調べ中でっす。ローカル作業だとうまくいくんだけどサーバーにアップしたら画像が表示されなくなりました(@_@;)
FireFoxではOKでIE6だとダメ。
ちなみにこのURLを調べるのにFireFoxのHTTP監視アドオンLiveHTTPHeadersが便利でした(^−^)
すべてのソースはこちら

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute" xmlns:rtc="CocomoNameSpace"
    backgroundGradientColors="[0xffffff,0xcccccc]"
    >
<mx:Script>
<![CDATA[
import com.adobe.rtc.sharedManagers.UserManager;
import com.adobe.rtc.sharedManagers.FileManager;
import com.adobe.rtc.sharedManagers.descriptors.FileDescriptor;
import com.adobe.rtc.messaging.UserRoles;
import com.adobe.rtc.messaging.NodeConfiguration;
import com.adobe.rtc.collaboration.FilePublisher;
import com.adobe.rtc.collaboration.FileSubscriber;
import com.adobe.rtc.events.SessionEvent;
import mx.utils.UIDUtil;
import mx.collections.ArrayCollection;
private var fileSubscriber :FileSubscriber;
private var filePublisher  :FilePublisher;
private var groupName      :String = "shareFileTest";
[Bindable]private var fileDescriptors:ArrayCollection = new ArrayCollection();
/**********************
 * Cocomo
 **********************/
//変化イベント
private function synchronizationChangeHandler(e:SessionEvent):void
{
    //チェンジイベント?
    if( e.type == SessionEvent.SYNCHRONIZATION_CHANGE && myConnectSession.isSynchronized )
    {
        //グループが設定されているかどうかチェック
        checkFileGourpDefined();
        //共有ファイルのリスト取得
        getFileList();
    }
}
//グループが設定されているかどうかチェック
private function checkFileGourpDefined():void
{
    //ファイルパブリッシュ(書き込み用クラス)の作成
    if( !filePublisher){
        filePublisher = new FilePublisher();
        filePublisher.initialize();
    }
    //現在のログインアカウントから情報をゲット
    var fileManager:FileManager = myConnectSession.fileManager;
    var userManager:UserManager = myConnectSession.userManager;
    myLog.text += "userID:" + userManager.myUserID + "\n";
    myLog.text += "userRole:" + userManager.myUserRole + "\n";
    myLog.text += "groupDefined:" + fileManager.isGroupDefined( groupName ) + "\n";
    myLog.text += "getUserRole:" + fileManager.getUserRole( userManager.myUserID , groupName ) + "\n";
    //まだグループなくてオーナーさん?
    if( !fileManager.isGroupDefined( groupName )
        && fileManager.getUserRole( userManager.myUserID , groupName ) == UserRoles.OWNER )
    {
        //グループがないので作成
        var nodeConfig:NodeConfiguration = new NodeConfiguration();
        nodeConfig.sessionDependentItems = false;
        filePublisher.createAndUseGroup(groupName , nodeConfig );
        myLog.text += "group not found\n";
    }else{
        //グループがあるのでグループ名を設定
        filePublisher.groupName = groupName;
        myLog.text += "group found\n";
    }
}
//共有ファイルのリスト取得
private function getFileList():void
{
    fileDescriptors = myConnectSession.fileManager.getFileDescriptors(groupName);
}
/**********************
 * ファイル操作
 **********************/
//ファイルアップロード
private function onUploadClick():void
{
    var filterArray:Array = [new FileFilter("*.jpg", "*.jpg")];
    filePublisher.browse(UIDUtil.createUID(), filterArray);
}
//ファイルダウンロード
private function onDownloadClick():void
{
    if( myGrid.selectedItem) {
        if( !fileSubscriber ){
            fileSubscriber = new FileSubscriber();
            fileSubscriber.initialize();
        }
        try{
            fileSubscriber.download( myGrid.selectedItem as FileDescriptor );
        }catch(e:Error) {
            trace("Error download: " + e.message);
        }
    }
}
//ファイル削除
private function onDeleteClick():void
{
    if( myGrid.selectedItem) {
        filePublisher.remove( myGrid.selectedItem as FileDescriptor);
    }
}
]]>
</mx:Script>
<rtc:AdobeHSAuthenticator id="auth" userName="アカウント" password="パスワード" />
<rtc:ConnectSessionContainer roomURL="http://connectnow.acrobat.com/名前/部屋名"
    id="myConnectSession" synchronizationChange="synchronizationChangeHandler(event)"
    authenticator="{auth}">
    <mx:VBox paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10">
    <mx:Label text="Cocomo ファイル共有テスト" fontSize="20" fontWeight="bold"/>
    <mx:HRule width="100%" />
        <mx:HBox>
            <mx:Button label="アップロード" click="onUploadClick()"/>
            <mx:Button label="ダウンロード" click="onDownloadClick()" enabled="{myGrid.selectedItem}"/>
            <mx:Button label="削除"         click="onDeleteClick()"   enabled="{myGrid.selectedItem}"/>
        </mx:HBox>
        <mx:DataGrid id="myGrid" dataProvider="{fileDescriptors}" width="1000" height="200">
            <mx:columns>
            <mx:DataGridColumn>
                <mx:itemRenderer>
                    <mx:Component>
                        <mx:Image source="{data.url + data.filename + '?mst=hogehoge&amp;token=' + data.token}" height="50"
                            />
                    </mx:Component>
                </mx:itemRenderer>
            </mx:DataGridColumn>
                <mx:DataGridColumn dataField="filename"/>
                <mx:DataGridColumn dataField="groupName"/>
                <mx:DataGridColumn dataField="id"/>
                <mx:DataGridColumn dataField="lastModified"/>
                <mx:DataGridColumn dataField="name"/>
                <mx:DataGridColumn dataField="previousFilename"/>
                <mx:DataGridColumn dataField="previousName"/>
                <mx:DataGridColumn dataField="size"/>
                <mx:DataGridColumn dataField="state"/>
                <mx:DataGridColumn dataField="submitterID"/>
                <mx:DataGridColumn dataField="token"/>
                <mx:DataGridColumn dataField="type"/>
                <mx:DataGridColumn dataField="uploadProgress"/>
                <mx:DataGridColumn dataField="url"/>
            </mx:columns>
        </mx:DataGrid>
        <mx:TextArea id="myLog" width="400" height="100"/>
    </mx:VBox>
</rtc:ConnectSessionContainer>
</mx:Application>