Uploader for Silverlight
手順 3:サーバーコードの追加

前の手順では、Silverlight アプリケーションを設定し、クライアントのアクションと動作を実装するコードをアプリケーションに追加しました。ただし、アプリケーションを実行すると、サーバーコードが実装されていないためにエラーが発生します。この手順では、引き続き Visual Studio で作業し、プロジェクトにサーバーコードを実装するためのコードを追加します。

サーバーコードを実装するには、次の手順に従います。

  1. Visual Studio のソリューションエクスプローラで、QuickStart.Web ソリューションを右クリックし、[追加]→[新しい項目]オプションを選択します。ただし、プロジェクトを "QuickStart" 以外の名前にした場合は、指定したプロジェクトの名前が "MyProject" だとして、MyProject.Web を右クリックします。

  2. [新しい項目の追加]ダイアログボックスで、[ジェネリックハンドラー]テンプレートを選択し、新しいクラス名を "photoUpload.ashx" に指定します。これは、前に C1Uploader オブジェクトを作成した際に使用した URI です。

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

  4. photoUpload.ashx ファイルを開き、ProcessRequest メソッドのデフォルトの実装を次のコードに置き換えます。

    コードのコピー
    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Const MAXFILES As Integer = 30
        ' クリーンアップします
        Dim path As String = context.Request.MapPath("Pictures")
        Dim files As String() = System.IO.Directory.GetFiles(path)
        If files.Length >= MAXFILES Then
            For Each fileName As String In files
            System.IO.File.Delete(fileName)
            Next
        End If
        ' アップロードされるファイルを取得します
        Dim i As Integer = 0
        While i < context.Request.Files.Count AndAlso i < MAXFILES
            Dim file As HttpPostedFile = context.Request.Files(i)
            Try
            ' Image オブジェクトにファイルをロードして、ファイルが実際に画像かどうかをチェックします
            Dim img As System.Drawing.Image = System.Drawing.Image.FromStream(file.InputStream)
            ' ファイルを Pictures フォルダに保存します
            Dim fileName As String = context.Request.MapPath("Pictures/" & file.FileName)
            file.SaveAs(fileName)
            Catch
            ' 有効な画像でない場合は、要求をスキップします
            Exit Try
            End Try
            i += 1
        End While
    End Sub
    
    コードのコピー
    public void ProcessRequest(HttpContext context)
    {
        const int MAXFILES = 30;
        // クリーンアップします
        string path = context.Request.MapPath("Pictures");
        string[] files = System.IO.Directory.GetFiles(path);
        if (files.Length >= MAXFILES)
        {
            foreach (string fileName in files)
                System.IO.File.Delete(fileName);
        }
        // アップロードされるファイルを取得します
        for (int i = 0; i < context.Request.Files.Count && i < MAXFILES; i++)
        {
            HttpPostedFile file = context.Request.Files[i];
            try
            {
                // Image オブジェクトにファイルをロードして、ファイルが実際に画像かどうかをチェックします
                System.Drawing.Image img = System.Drawing.Image.FromStream(file.InputStream);
                // ファイルを Pictures フォルダに保存します
                string fileName = context.Request.MapPath("Pictures/" + file.FileName);
                file.SaveAs(fileName);
            }
            catch
            {
                // 有効な画像でない場合は、要求をスキップします
                break;
            }
        }
    }
    

    このコードは、最初に、画像フォルダに 30 個を超える画像がある場合に、その画像フォルダをクリーンアップします。実際のアプリケーションでは、別の方法を使用することもできます。たとえば、古い画像を圧縮したり、ユーザーごとにストレージ制限を適用します。

    このコードは、クリーンアップ後に、context.Request.Files コレクション内のファイルをループ処理し、それらのファイルが実際に画像ファイルかどうかをチェックします。ここでは、クライアント部分のコードを実装するときにも同じチェックを追加しましたが、アプリケーションの両側を保護することが重要です。最後に、各画像を Pictures フォルダに保存します。

ここまでの成果

これで、C1Uploader コントロールを使ってファイルをサーバーにアップロードする Silverlight アプリケーションを作成できました。次の手順では、このアプリケーションを実行して実行時の操作を確認します。

関連トピック

 

 


Copyright © GrapeCity inc. All rights reserved.