Uploader for Silverlight
ファイルのアップロードとプレビュー

Uploader for SilverlightPDF for Silverlight を一緒に使用することで、PDF ファイルを作成してサーバーにアップロードできます。このトピックでは、ユーザーが印刷するファイルをプレビューできるように、C1Uploader クラスと C1Pdf を使用して、ストリームにアップロードされる PDF ファイルを作成します。簡略化のために、このプロジェクトでは、Uploader for Silverlight サンプルに含まれる C1UploaderHelper.cs コードファイルを使用します。

次の手順に従います。

  1. Visual Studio 2008 で、[ファイル]→[新規作成]→[プロジェクト]を選択します。

  2. [新しいプロジェクト]ダイアログボックスの左ペインから言語を選択し、テンプレートリストから[Silverlight アプリケーション]を選択します。プロジェクトの名前を入力し、[OK]をクリックします。[新しい Silverlight アプリケーション]ダイアログボックスが表示されます。

  3. [OK]をクリックしてデフォルト設定を受け入れ、[新しい Silverlight アプリケーション]ダイアログボックスを閉じると、プロジェクトが作成されます。MainPage.xaml ファイルが開きます。

  4. ソリューションエクスプローラウィンドウでプロジェクトを右クリックし、[参照の追加]を選択します。

  5. [参照の追加]ダイアログボックスで、C1.Silverlight.Pdf.dll および C1.Silverlight.Uploader.dll アセンブリを見つけて選択し、[OK]をクリックしてプロジェクトに参照を追加します。

  6. 次の XAML マークアップを MainPage.xaml ファイルの <Grid> タグと </Grid> タグの間に追加します。

    XAML
    コードのコピー
    <StackPanel Width="300" HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="Enter text here:" Margin="10"/>
        <TextBox Name="tb" Margin="10" Height="100" TextWrapping="Wrap"/>
        <Button Content="Print and Open PDF" Margin="10" Click="Button_Click" />
    </StackPanel>
    

    このマークアップは、PDF に入れるテキストを入力するテキストボックスと、テキストを PDF に変換してファイルをサーバーにアップロードするためのボタンを作成します。

  7. ソリューションエクスプローラで、MyProjectWeb アプリケーションを右クリックします。"MyProject" には、実際のプロジェクトアプリケーションの名前が入ります。[新しいフォルダ]を選択し、フォルダ名を "temp" に指定します。このフォルダには、PDF ファイルが置かれます。

  8. ソリューションエクスプローラで、MainPage.xaml ファイルを右クリックして[コードの表示]を選択し、コードビューに切り替えます。

  9. コードビューで、次の import 文をページの先頭に追加します(ページに含まれていない場合)。

    コードのコピー
    Imports System.IO
    Imports C1.Silverlight.Pdf
    Imports C1.Silverlight.Uploader
    
    コードのコピー
    using System.IO;
    using C1.Silverlight.Pdf;
    using C1.Silverlight.Uploader;
    
  10. MainPage クラスに次のコードを追加します。

    コードのコピー
    Private Sub Button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        ' PDF を作成します
        Dim doc As New C1PdfDocument()
        Dim st As String = Nothing
        st = tb.Text
        doc.DrawString(st, New Font("Arial", 14), Colors.Black, New Rect(0, 0, 500, 100))
        ' ストリームを生成します
        Dim stream As Stream
        stream = New MemoryStream()
        doc.Save(stream)
        ' ストリームをアップロードします
        Dim uploader = CreateUploader()
        uploader.AddFile("test.pdf", stream)
        uploader.BeginUploadFiles()
        AddHandler uploader.UploadCompleted, AddressOf uploader_UploadCompleted
    End Sub
    Private Sub uploader_UploadCompleted(ByVal sender As Object, ByVal e As UploadCompletedEventArgs)
        ' PDF に移動します
        If e.[Error] Is Nothing Then
            Dim url = New Uri(DirectCast(e.Response, String())(0))
            System.Windows.Browser.HtmlPage.Window.Navigate(url)
        End If
    End Sub
    Private Function CreateUploader() As C1Uploader
        Dim mpUploader As New C1UploaderPost(FilesPerRequest.AllFilesInOneRequest)
        mpUploader.Settings.Address = C1.Silverlight.Extensions.GetAbsoluteUri("Handler.ashx")
        Return mpUploader
    End Function
    
    コードのコピー
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // PDF を作成します
        C1PdfDocument doc = new C1PdfDocument();
        doc.DrawString(tb.Text, new Font("Arial", 12), Colors.Black, new Rect(0, 0, 500, 100));
        // ストリームを生成します
        Stream stream;
        stream = new MemoryStream();
        doc.Save(stream);
        // ストリームをアップロードします
        var uploader = CreateUploader();
        uploader.AddFile("test.pdf", stream);
        uploader.BeginUploadFiles();
        uploader.UploadCompleted += new EventHandler(uploader_UploadCompleted);
    }
    void uploader_UploadCompleted(object sender, UploadCompletedEventArgs e)
    {
        // PDF に移動します
        if (e.Error == null)
        {
            var url = new Uri(((string[])e.Response)[0]);
            System.Windows.Browser.HtmlPage.Window.Navigate(url);
        }
    }
    private C1Uploader CreateUploader()
    {
        C1UploaderPost mpUploader = new C1UploaderPost(FilesPerRequest.AllFilesInOneRequest);
        mpUploader.Settings.Address = C1.Silverlight.Extensions.GetAbsoluteUri("Handler.ashx");
        return mpUploader;
    }
    
  11. Visual Studio のソリューションエクスプローラで、MyProjectWeb ソリューションを右クリックします。"MyProject" には、実際のプロジェクト名が入ります。[追加]→[既存の項目]オプションを選択します。

  12. [既存項目の追加]ダイアログボックスで、サンプルがインストールされている ControlExplorerWeb フォルダに移動します。C1UploaderHelper.cs ファイルを選択し、[追加]ボタンをクリックします。デフォルトでは、ControlExplorerWeb フォルダは、ComponentOne Samples\Silverlight\ControlExplorer\ControlExplorerWebDocuments フォルダに置かれています。

  13. Visual Studio のソリューションエクスプローラで、MyProjectWeb ソリューションを右クリックします。"MyProject" には、実際のプロジェクト名が入ります。[追加]→[新しい項目]オプションを選択します。

  14. [新しい項目の追加]ダイアログボックスで、[ジェネリックハンドラ]テンプレートを選択し、新しいクラスの名前を "Handler.ashx" に指定します。

  15. [追加]をクリックしてプロジェクトにファイルを追加したら、[新しい項目の追加]ダイアログボックスを閉じます。

  16. Handler.ashx コードファイルを開き、次の import 文が含まれていない場合は、これをページの先頭に追加します。"MyProject" には、ソリューションエクスプローラでの実際のプロジェクトアプリケーション名が入ります。

    コードのコピー
    Imports System.Web
    Imports System.Web.Services
    Imports MyProject
    
    コードのコピー
    using System.Web;
    using System.Web.Services;
    using MyProject;
    
  17. ProcessRequest メソッドのデフォルトの実装を次のコードに置き換えます。

    コードのコピー
    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Try
            ' カスタムパラメータを取得します
            Dim parameters As String = context.Request.Params("parameters")
            For i As Integer = 0 To context.Request.Files.Count - 1
            ' アップロードされるファイルを取得し、完全パスを計算してサーバーに保存します
            Dim file As HttpPostedFile = context.Request.Files(i)
            Dim serverFileName As String = C1UploaderHelper.GetServerPath(context.Server, file.FileName)
            If C1UploaderHelper.ProcessPart(context, file.InputStream, serverFileName, 1, 1) Then
                ' アップロードされるファイルの URL を応答に追加します
                Dim url As String = C1UploaderHelper.GetUploadedFileUrl(context, "Handler.ashx", file.FileName)
                context.Response.Write((If(i > 0, "
            Else
                C1UploaderHelper.WriteError(context, C1UploaderHelper.ERROR_MESSAGE)
                Exit For
            End If
            Next
            Catch exc As Exception
            C1UploaderHelper.WriteError(context, exc.Message)
            context.Response.[End]()
        End Try
    End Sub
    
    コードのコピー
    public void ProcessRequest(HttpContext context)
    {
        try
        {
            // カスタムパラメータを取得します
            string parameters = context.Request.Params["parameters"];
            for (int i = 0; i < context.Request.Files.Count; i++)
            {
                // アップロードされるファイルを取得し、完全パスを計算してサーバーに保存します
                HttpPostedFile file = context.Request.Files[i];
                string serverFileName = C1UploaderHelper.GetServerPath(context.Server, file.FileName);
                if (File.Exists(file.FileName))
                    File.Delete(file.FileName);
                if (C1UploaderHelper.ProcessPart(context, file.InputStream, serverFileName, 1, 1))
                {
                    // アップロードされるファイルの URL を応答に追加します
                    string url = C1UploaderHelper.GetUploadedFileUrl(context, "Handler.ashx", file.FileName);
                    context.Response.Write((i > 0 ? "
                }
                else
                {
                    C1UploaderHelper.WriteError(context, C1UploaderHelper.ERROR_MESSAGE);
                    break;
                }
            }
        }
        catch (Exception exc)
        {
            C1UploaderHelper.WriteError(context, exc.Message);
            context.Response.End();
        }
    }
    

    ここまでの成果

    これで、テキストを PDF ファイルとしてアップロードしてプレビューする Silverlight アプリケーションを作成できました。アプリケーションの機能を確認するには、次の手順に従います。

    1. [デバッグ]→[デバッグ開始]を選択して、アプリケーションを実行します。

    2. テキストボックスにテキスト("Hello World!" など)を入力します。

    3. [Print and Open PDF]ボタンをクリックします。
      入力したテキストが test.pdf ファイルに追加されて開かれます。この PDF ファイルを閉じ、テキストボックスに別のテキストを入力し、同様にボタンをクリックします。PDF ファイルが開かれて、新しいテキストが表示されます。

関連トピック

 

 


Copyright © GrapeCity inc. All rights reserved.