none
WSSからファイルをローカルにコピーする方法 RRS feed

  • 質問

  • WSSのドキュメントライブラリにファイルがアップロードされた際に、
    アップロードされたドキュメントをローカルフォルダにコピーしたいのですが、方法についてお教えいただけませんでしょうか。

    開発環境はVS2005、C#
    フィーチャーとしてWSSに登録する想定です。
    2009年12月12日 5:40

回答

  • コーディングができていないのですが、動作としては

    1.ドキュメントライブラリに対するイベントレシーバ:ItemAddedで起動するフィーチャーを作成
    2.ItemAdded時に、サーバローカルにSiteIDを名前にしたフォルダを作成
    3.2で作成したフォルダ内にアップロードされたファイルをコピー
    4.xmlにファイル名を要素として追加
    5.以降、サーバソフトウェアにてファイルの変換処理等を行う予定

    イベントレシーバのことをすっかり忘れていました・・・
    これなら簡単に実装できますね


    サンプルコードはwebサービスとして実装していたコードの抜粋なので適宜変更してください
    お約束ですが、細かなエラー処理は省いていますので必要に応じて実装するようにしてください

    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Utilities;
    
    public void DownloadDocument( string LibUrl, string FileName, string DownloadPath )
    {
        using( SPWeb web = new SPSite( LibUrl ).OpenWeb() ) {
            // 外部への操作を有効にする
            web.AllowUnsafeUpdates = true;
    
            try {
                // ファイルストリームの取得
                SPFile src = web.GetFile( SPUrlUtility.CombineUrl( LibUrl, FileName ) );
                Stream srcFile = src.OpenBinaryStream();
                srcFile.Position = 0; // おまじない
    
                // ファイルのダウンロード
                using( FileStream stream = new FileStream( Path.Combine( DownloadPath, FileName ), FileMode.Create, FileAccess.Write ) ) {
                    byte[] data = new byte[4096];
                    int read = 0;
                    while( (read = srcFile.Read( data, 0, data.Length )) > 0 ) {
                        stream.Write( data, 0, read );
                    }
                }
            }
            catch( Exception ex ) {
                throw ex;
            }
            finally {
                // 外部への操作の有効化を元に戻す
                web.AllowUnsafeUpdates = false;
            }
        }
    }
    


    サンプルコードの引数は、保存したいファイルのパスが以下の場合に、
    >http://wws/sites/pages/file.xml

    LibUrl:「http://wws/sites/pages/
    FileName:「file.xml」

    を指定します

    DownloadPathにはサーバのローカルフォルダパスを指定すると、
    そのフォルダ内に同名のファイルが作成されるようになっています
    • 回答としてマーク GunParade 2009年12月17日 7:19
    2009年12月14日 7:31

すべての返信

  • ローカルフォルダが、
    WSSをホストしているサーバのローカルを指しているのか、
    クライアントのローカルを指しているのかにもよりますが、
    サーバローカルであれば、WSSのSDKを利用してコードを書くことで実現は出来ると思います。

    この際、ライブラリにアップロードされたタイミングでコピーを開始したい場合には、
    トリガとして、ワークフローのアイテムが新規作成されたタイミングが使えると思いますので、
    ワークフローとして実装する必要があるかもしれません。

    ワークフローを使わない場合は、何らかのタイマーを利用して定期的に実行する必要があると思います。


    コードを書かずにWSSの標準機能で実現する方法はすぐには思いつかないので(多分できない気がします・・・)、
    コードを書く前提ならローカルに保存するだけの簡単なサンプルも提示できると思います。
    (ワークフローは勉強中なのでサンプルは出せません・・・)
    2009年12月14日 2:46
  • ニムファエアさん
    ご回答ありがとうございます。
    こちらの情報が足りず、申し訳ありません。

    ローカル:サーバローカルとなります。

    お手数なのですが、宜しければサンプルをご提示頂けると幸いです。

    コーディングができていないのですが、動作としては

    1.ドキュメントライブラリに対するイベントレシーバ:ItemAddedで起動するフィーチャーを作成
    2.ItemAdded時に、サーバローカルにSiteIDを名前にしたフォルダを作成
    3.2で作成したフォルダ内にアップロードされたファイルをコピー
    4.xmlにファイル名を要素として追加
    5.以降、サーバソフトウェアにてファイルの変換処理等を行う予定

    このような想定をしております。
    プログラムを学び出してまだ1カ月しか経っておらず、状況説明に不足があるかもしれませんが
    宜しくお願い致します。
    2009年12月14日 5:32
  • コーディングができていないのですが、動作としては

    1.ドキュメントライブラリに対するイベントレシーバ:ItemAddedで起動するフィーチャーを作成
    2.ItemAdded時に、サーバローカルにSiteIDを名前にしたフォルダを作成
    3.2で作成したフォルダ内にアップロードされたファイルをコピー
    4.xmlにファイル名を要素として追加
    5.以降、サーバソフトウェアにてファイルの変換処理等を行う予定

    イベントレシーバのことをすっかり忘れていました・・・
    これなら簡単に実装できますね


    サンプルコードはwebサービスとして実装していたコードの抜粋なので適宜変更してください
    お約束ですが、細かなエラー処理は省いていますので必要に応じて実装するようにしてください

    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Utilities;
    
    public void DownloadDocument( string LibUrl, string FileName, string DownloadPath )
    {
        using( SPWeb web = new SPSite( LibUrl ).OpenWeb() ) {
            // 外部への操作を有効にする
            web.AllowUnsafeUpdates = true;
    
            try {
                // ファイルストリームの取得
                SPFile src = web.GetFile( SPUrlUtility.CombineUrl( LibUrl, FileName ) );
                Stream srcFile = src.OpenBinaryStream();
                srcFile.Position = 0; // おまじない
    
                // ファイルのダウンロード
                using( FileStream stream = new FileStream( Path.Combine( DownloadPath, FileName ), FileMode.Create, FileAccess.Write ) ) {
                    byte[] data = new byte[4096];
                    int read = 0;
                    while( (read = srcFile.Read( data, 0, data.Length )) > 0 ) {
                        stream.Write( data, 0, read );
                    }
                }
            }
            catch( Exception ex ) {
                throw ex;
            }
            finally {
                // 外部への操作の有効化を元に戻す
                web.AllowUnsafeUpdates = false;
            }
        }
    }
    


    サンプルコードの引数は、保存したいファイルのパスが以下の場合に、
    >http://wws/sites/pages/file.xml

    LibUrl:「http://wws/sites/pages/
    FileName:「file.xml」

    を指定します

    DownloadPathにはサーバのローカルフォルダパスを指定すると、
    そのフォルダ内に同名のファイルが作成されるようになっています
    • 回答としてマーク GunParade 2009年12月17日 7:19
    2009年12月14日 7:31
  • ニムファエアさん

    返信が遅くなり、申し訳お座いません。
    ご回答ありがとうございます。

    お教え頂いたコードで、実際にローカル保存が動作しました。
    完全に行き詰っていたので助かりました。
    ありがとうございます。

    参考とさせて頂きます。

    宜しくお願い致します。
    2009年12月17日 7:19