2011-12-04 14 views
1

ウェブカメラから画像をキャプチャし、それをSQL Serverデータベースにシリアル化したいJavascriptを作成しました。データベースのフィールドは通常のvarbinary(max)です。ASP.Net jQuery webcam image to database varbinary(max)

「『797719006-』の挿入に失敗しました::Telerik.OpenAccess.RT.sql.SQLExceptionを私は生の画像は私のWebメソッドに渡されるが、それは次のエラーを投げ続けること放火犯から見ることができます。テーブル 'GoldStar.Students.Pictures';

画像をキャプチャするjavascriptはうまくいきますので、問題はありません。保存するだけですおそらく、私はajax経由でウェブメソッドを使って更新することで、複雑すぎるのでしょうか?

登録ページでウェブ対応のメソッドを作成しました。

[WebMethod(EnableSession = true)] 
    public static void UpdatePicture(object picture) 
    { 
     //Check if the user already has a picture in the database. 
     using (var dataContext = new DAL.GoldStarModel()) 
     { 
      var userPictures = (from p in dataContext.Pictures 
           where p.UserId == (Guid) Membership.GetUser().ProviderUserKey 
           select p); 

      if (userPictures.Count() > 0) 
      { 
       //If user already has a picture then update. 
       userPictures.First().Picture = picture as byte[]; 
      } 
      else 
      { 
       //If User does NOT have a picture then add one. 
       dataContext.Add(new Students.Pictures() 
            { 
             UserId = (Guid) Membership.GetUser().ProviderUserKey, 
             Picture = picture as byte[], 
             CreationDate = DateTime.Now 

            }); 
      } 

      dataContext.SaveChanges(); 
     } 

次のように関連Javascriptがある:一見、それはへの文字列のみパスだから

   var canvas = document.getElementById("canvas"); 
       var profilePic = $('#profilePic') 

       $('#webcam').hide(); 

       try { 
        //Update the profile picture in the parent. 
        var currentPic = self.parent.document.getElementById('MainContent_UserFormView_RegisterUser_StudentPicture'); 

        var oldWidth = Number(currentPic.width); 
        var oldHeight = Number(currentPic.height); 

        currentPic.src = canvas.toDataURL(); 

        currentPic.width = oldWidth; 
        currentPic.height = oldHeight; 

        profilePic.show(); 

        $.ajax({ 
         type: "POST", 
         url: "/Account/Register.aspx/UpdatePicture", 
         contentType: "application/json; charset=utf-8", 
         data: "{'picture': '" + currentPic.src + "'}", 
         dataType: "json", 
         success: function (result) { 
          //ApplyTemplate(result) 
         } 
        }); 
       } 
+0

デバッガを使用してサーバー側のコードを歩いていますか?オフハンドでは、Objectからbyte []へのキャストが失敗しているようです。 – RickNZ

+0

ええ、それはちょうどそれが失敗している場所です。それは問題です、私はどのようにjavascriptのHtmlImageElementまたは生のイメージデータ(currentPic.src)をbyte []に​​シリアル化してdbの記憶域をシリアル化するかわからないようです。私はグーグルではありますが、まだ関連するものは見つけていません。私がbyte []に​​している安全なキャストは、暗闇の中でちょうど刺さったものであり、私が思ったように多くを壊していました。 – coderpros

答えて

1

あなたは、ワイヤ上で何が起こっているのかをチェックするためにシオマネキのようなものを使用している、このようになります。画像データではなく画像データである。

サーバー上では、バイト配列を既に持っていない限り、オブジェクトからバイト配列にキャストすることはできません。その場合は、型として使用します。コードからも、jqueryはバイナリ配列のデータをメソッドに渡すことはほとんどありません。

画像データをアップロードするにはSilverlightやFlashのようなものが必要でしょう。 htmlサンドボックスは、サーバーにファイルデータを送信する際に非常に難しいです。

更新

あなたは文字列を解析する必要があります。あなたは必要なものはすべて持っています。それは良いことです。 base64文字列がどこから始まるかを調べる必要があります。そのbase64文字列&を使用して、あなたのイメージであるバイト配列を与えるConvert.FromBase64Stringを使用してください。これをあなたのデータベースに保存してください。

文字列を受け入れるようにwebmethodを変更したいと思います。キャンバスで生成されている文字列であるためです。すべてがうまくいくはずです。

+0

はい、Firebugを使用してバックグラウンドで何が起こっているのかを確認しています。慎重に見れば、この場合の.srcはcanvas.toDataURL()に設定されているため、画像への文字列パスではありません。 "data:image/png; base64、iVBORw0KGgoAAAAZUhUU ..."意味のあるものをどうやってやるか全く分かりません。 – coderpros

関連する問題