-1

これが私が達成しようとしていることの要点です:

  • 編集ビューから Web カメラの画像をキャプチャします。(働く)
  • イメージにファイル名とパスを割り当てます。(働く)
  • 画像を images フォルダーに保存します。(働く)
  • イメージへのパスをデータベースに保存します。(動作していません)

ここに私のキャプチャコントローラがあります:

      public void Capture(String FileLocation)
    {
        //var FileLocation = Server.MapPath("~/Images/test.jpg");
        var stream = Request.InputStream;
        string dump;

        using (var reader = new StreamReader(stream))
            dump = reader.ReadToEnd();


        if (System.IO.File.Exists(FileLocation))
        {
            System.IO.File.Delete(FileLocation);
            System.IO.File.WriteAllBytes(FileLocation, String_To_Bytes2(dump));
        }
        else System.IO.File.WriteAllBytes(FileLocation, String_To_Bytes2(dump));


        return;

    }

そして、ここに Edit コントローラがあります:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(TrappingEvent trappingevent)
    {

        if (ModelState.IsValid)
        {


            db.Entry(trappingevent).State = EntityState.Modified;
            db.SaveChanges();

            return RedirectToAction("Index");
        }

        ViewBag.PersonId = new SelectList(db.People, "Id", "First_Name", trappingevent.PersonId);
        return View(trappingevent);
    }

私の限られた理解では、ファイル パスを変数として Capture void からコントローラーに渡し、モデルにバインドするとよいでしょう。

ご協力いただきありがとうございます。

4

1 に答える 1

0

その働き!まあ、私は回りくどい方法でそれをやりましたが、それでも提案を聞いてうれしいです.

要点は次のとおりです。

  • キャプチャ ボタンをクリックすると、次の関数が実行されます。

    function CaptureAndAssignText() {
    var Div = document.getElementById("ImagePath");//ImagePath is the field
    // I want to bind to the model.
    
    newText = "ID_" + @Model.Id + ".jpg";//Here I grab the Id of 
    //the current model to use as the file name
    
    Div.value = newText;//Assign the file name to the input 
    //field ready for submission.
    
    webcam.capture();//Run the capture function
    }
    
  • これがキャプチャ機能です(かなり標準です-これに対応するドキュメントの準備が必要かどうか誰か教えてもらえますか?)

    $(document).ready(function () {
                            $("#Camera").webcam({
                                width: 320,
                                height: 240,
                                mode: "save",
                                swffile: "@Url.Content("~/Scripts/jscam.swf")",
                                onTick: function () { },
                                onSave: function () {
                                },
                                onCapture: function () {
                                    webcam.save("@Url.Action("Capture", "TrapActivity", new { id = @Model.Id , pid = @Model.PersonId})");
                                },
                                debug: function () { },
                                onLoad: function () { }
                            });
                       });
    

これは、モデル ID を文字列として受け入れるように変更されたコントローラーです (簡単に参照できるように、String to Bytes 関数が含まれています)。

    public ActionResult Capture(string ID)
    {
        var path = Server.MapPath("~/Images/ID_" + ID + ".jpg" );

        //var path1 = "~/Images/test.jpg;";



        var stream = Request.InputStream;
        string dump;

        using (var reader = new StreamReader(stream))
            dump = reader.ReadToEnd();


        if (System.IO.File.Exists(path))
        {
            System.IO.File.Delete(path);
            System.IO.File.WriteAllBytes(path, String_To_Bytes2(dump));
        }
        else System.IO.File.WriteAllBytes(path, String_To_Bytes2(dump));


        return View(ID);

    }

    private byte[] String_To_Bytes2(string strInput)
    {
        int numBytes = (strInput.Length) / 2;
        byte[] bytes = new byte[numBytes];

        for (int x = 0; x < numBytes; ++x)
        {
            bytes[x] = Convert.ToByte(strInput.Substring(x * 2, 2), 16);
        }

        return bytes;
    }

キャプチャがクリックされたら。厳密に型指定されたフォームを送信しているかのように、フォームを送信できます。

この方法には潜在的な問題があります

  • この方法では、1 つのイメージしか保存できません。
  • 本当に奇妙な方法でファイルパスを保存するようなものです。

私は提案を受け入れる以上のものです。

于 2016-11-02T03:55:05.833 に答える