WebClientでインターネットからファイルをダウンロードしてOffice365(Sharepoint)のDocument File(ドキュメントファイル)に保存する。(C# Silverlight + Office365 Document Library)

WebClientでインターネットからファイルをダウンロードしてOffice365(Sharepoint)のDocument File(ドキュメントファイル)に保存する。(C# Silverlight + Office365  Document Library)

        private Byte[] m_dt = new Byte[] { };
        private void FileDownload_Office365Save()
        {
            var client = new WebClient();
            client.OpenReadCompleted += OpenReadCompleted;
            client.OpenReadAsync(new Uri("http://xxxxxxxx/test.pdf", UriKind.Absolute));
        }

        void OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            //InvokeしないとMessageBox動かない。
            Dispatcher.BeginInvoke(() =>
            {
                try
                {
                    // エラーチェック
                    if (e.Error != null)
                    {
                        MessageBox.Show(e.Error.Message + "\r\n" + e.Error.StackTrace);
                        return;
                    }

                    System.IO.Stream sr = null;
                    System.IO.BinaryReader br = null;

                    try
                    {
                        //取得したバイナリデータを Byte[]に読み込み
                        sr = (System.IO.Stream)e.Result;
                        br = new System.IO.BinaryReader(sr);
                        m_dt = new Byte[sr.Length];
                        br.Read(m_dt, 0, m_dt.Length);

                        //読み込んだバイナリデータをOffice365(Sharepoint document)にアップロード
                        string siteURL = ClientContext.Current.Url;
                        string strListName = "YYYYYY";  //ドキュメントリストの名前
                        string strDocumentName = "test.pdf"; //ドキュメントファイルに保存する名前
                        UploadDocument(siteURL, strListName, strDocumentName, m_dt);

                    }
                    finally
                    {
                        if (br != null)
                        {
                            br.Close();
                        }

                        if (sr != null)
                        {
                            sr.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace);
                }
            });
        }

        protected void UploadDocument(string siteURL, string strListName, string strDocumentName, byte[] documentStream)
        {

            using (ClientContext clientContext = new ClientContext(siteURL))
            {
                List list = clientContext.Web.Lists.GetByTitle(strListName);
                FileCreationInformation fileCreationInformation = new FileCreationInformation();

                fileCreationInformation.Content = documentStream;
                fileCreationInformation.Overwrite = true;
                fileCreationInformation.Url = strDocumentName;

                SP.File uploadFile = list.RootFolder.Files.Add(fileCreationInformation);
                //uploadFile.ListItemAllFields["DocType"] = "Favourites";
                uploadFile.ListItemAllFields.Update();
                clientContext.ExecuteQueryAsync(
                    new ClientRequestSucceededEventHandler(delegate(object o, ClientRequestSucceededEventArgs successargs)
                    {
                        this.Dispatcher.BeginInvoke(new Action(delegate()
                        {
                            try
                            {
                                MessageBox.Show("登録しました。");
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace);
                            }

                        }), null);
                    }),
                    new ClientRequestFailedEventHandler(delegate(object o, ClientRequestFailedEventArgs failedArgs)
                    {
                        this.Dispatcher.BeginInvoke(new Action(delegate()
                        {
                            try
                            {
                                MessageBox.Show(failedArgs.ErrorDetails + "   " + failedArgs.Message);
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace);
                            }

                        }), null);
                    })
                );

            }
        }

UserControl の基本クラス(Base Class) と派生クラス(Derived Class)を作る。 (C# Silverlight)

UserControl の基本クラス(Base Class) と派生クラス(Derived Class)を作る。 (C# Silverlight)

Silverlightで画面を作っていくとユーザコントロール(UserControl)の継承したくなります。

基本クラス(Base Class)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using Microsoft.SharePoint.Client;
using SP = Microsoft.SharePoint.Client;
using System.Collections.ObjectModel;

namespace SilverlightProjectMain
{
    public partial class Common_0100Base : UserControl
    {
        public Common_0100Base()
        {
            InitializeComponent();
        }
    }
}
<UserControl
    x:Class="SilverlightProjectMain.Common_0100Base"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:SilverlightProjectMain="clr-namespace:SilverlightProjectMain"
    mc:Ignorable="d"    d:DesignHeight="300" d:DesignWidth="400">
    <Grid x:Name="LayoutRoot" Background="White">    </Grid>
</UserControl>

 

派生クラス(Derived Class)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightProjectMain
{
    public partial class Derived : Common_0100Base//UserControl
    {
        public Derived()
        {
            InitializeComponent();
        }
    }
}

 

<SilverlightProjectMain:Common_0100Base
    x:Class="SilverlightProjectMain.Derived"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:SilverlightProjectMain="clr-namespace:SilverlightProjectMain"
    mc:Ignorable="d"    d:DesignHeight="300" d:DesignWidth="400">
    <Grid x:Name="LayoutRoot" Background="White">    </Grid>
</SilverlightProjectMain:Common_0100Base>

 

<メモ>
Xamlファイルの1、7、10行目を修正しないと以下のエラーが表示されます。

エラー 1 ‘SilverlightProjectMain.Derived’ の partial 宣言では、異なる基本クラスを指定してはいけません。 C:\EAP_Office365\SilverlightProjectMain\Derived.xaml.cs 15 26 SilverlightProjectMain

ドキュメントライブラリーからのデータの読み込み(C# Silverlight + Office365 Document Library)

執筆中です。

ドキュメントライブラリーからのデータの読み込み(C# Silverlight + Office365  Document Library)

方法2は以下の2種類あります。

①OpenBinaryDirectを利用する方法

この方法をSharePoint Onlineで再度やってみたら動かない。Callbackがされずエラーすら表示できない 2012/11/30、2番の方法なら動きます。
(Office365ではSandbox では OpenBinaryDirectから直接ファイルFileInformation オブジェクトを取得できない。)

        private void doc_download2_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                ClientContext context = ClientContext.Current;
                //ClientContext context = new ClientContext(ApplicationContext.Current.Url); //"ClientContext.Current"と同じ

                //Document Library(ドキュメントライブラリ)の相対パスを指定する。
                String strServerRelativeUrl = "/Lists/List_Template/Template_Quotation_V_1_0_0.xlsx";
                File.OpenBinaryDirect(context, strServerRelativeUrl, OnOpenSucceeded, OnOpenFailed);
            }
            catch (Exception ex)
            {
                ShowException(ex);
            }

        }

        private void OnOpenSucceeded(object sender, OpenBinarySucceededEventArgs args)
        {
            //InvokeしないとMessageBox動かない。
            Dispatcher.BeginInvoke(() =>
            {
                try
                {
                    //Textファイル(File)の読み込みの場合
                    //System.IO.StreamReader strReader = new System.IO.StreamReader(args.Stream);
                    //String fileContents = strReader.ReadToEnd();
                    //strReader.Close();

                    //Binaryファイル(File)の場合はSystem.IO.BinaryReader
                    System.IO.BinaryReader br = new System.IO.BinaryReader(args.Stream);
                    Byte[] dt = new Byte[args.Stream.Length];
                    br.Read(dt, 0, dt.Length);
                    br.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace);
                }
            });
        }

        private void OnOpenFailed(object sender, OpenBinaryFailedEventArgs args)
        {
            Dispatcher.BeginInvoke(() =>
            {
                MessageBox.Show(args.Message + "\r\n" + args.Message);
            });
        }

②WebClientを利用する方法

        private void doc_download2_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                var client = new WebClient();
                client.OpenReadCompleted += CallWebService_OpenReadCompleted2;
                string s = ApplicationContext.Current.Url + "/Lists/List_Template/Template_Quotation_V_1_0_0.xlsx";
                //string s =  "http://office365/2/Lists/List_Template/Template_Quotation_V_1_0_0.xlsx";
                client.OpenReadAsync(new Uri(s, UriKind.Absolute));
            }
            catch (Exception ex)
            {
            }
        }
        private Byte[] m_dt = new Byte[] { };

        void CallWebService_OpenReadCompleted2(object sender, OpenReadCompletedEventArgs e)
        {
            // エラーチェック
            if (e.Error != null)
            {
                return;
            }

            System.IO.Stream sr = null;
            System.IO.BinaryReader br = null;

            try
            {
                sr = (System.IO.Stream)e.Result;
                br = new System.IO.BinaryReader(sr);

                m_dt = new Byte[sr.Length];
                br.Read(m_dt, 0, m_dt.Length);
            }
            finally
            {
                if (br != null)
                {
                    br.Close();
                }

                if (sr != null)
                {
                    sr.Close();
                }
            }
            return;
        }