簡體   English   中英

使用Knockout和webapi c#上傳圖片

[英]Image upload with Knockout and webapi c#

我正在嘗試使用Knokout JS和web api上傳圖像。 這是我的代碼

<div class="row">
<div class="col-sm-4">
    <h3>Send Feedback</h3>
    <form data-bind="submit: sendFeedback">
        <div class="form-group">
            <label>Feedback</label>
            <textarea class="form-control" data-bind="value: feedbackText"></textarea>
        </div>
        <div class="form-group">
            <label>Version Id</label>
            <input class="form-control" type="text" data-bind="value: versionId" />
        </div>
        <div class="form-group">
            <label>Image</label>

            <input class="form-control" type="file"
                   data-bind="file: {data: fileInput, name: fileName, reader: someReader}" />
        </div>
        <div class="form-group">
            <button type="submit" class="btn btn-default">Submit</button>
        </div>
    </form>
</div>

我正在使用這個自定義綁定

https://github.com/TooManyBees/knockoutjs-file-binding

然后在我的腳本代碼中我這樣做

    self.sendFeedback = function () {
    self.result('');

    var feedBackData = {
        versionId: self.versionId(),
        text: self.feedbackText(),
        screenShot: self.fileInput
    };

    $.ajax({
        type: 'POST',
        url: apiUrl + '/Feedback/Add',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(feedBackData)
    }).done(function (data) {
        self.result("Done!");
    }).fail(showError);

}

我不確定代碼的服務器部分。 到目前為止我寫過這個

    public void Add(HttpPostedFileBase screenShot, String versionId, String text)
    {
        String imgId = null;

        int count = HttpContext.Current.Request.Files.Count;

        if (screenShot != null && screenShot.ContentLength > 0)
        {
            Images img = Images.Create().Save();
            imgId = img.Id;
            BlobHelper.PutFile(imgId, screenShot.InputStream);
        }

        Feedback.Create(versionId, text, imgId).Save(); 

    }

有關如何做到這一點的任何想法?

fileInput包含base64編碼的文件數據。 它是一個字符串,所以HttpPostedFileBase不起作用。

更改表單HTML:

  <input class="form-control" type="file"
               data-bind="file: {data: fileInput}" />

更改viewmodel代碼,如下所示:

// store file data here
self.fileInput = ko.observable(); // is this present already?

var feedBackData = {
        versionId: self.versionId(),
        text: self.feedbackText(),
        screenShot: self.fileInput()
    };

$.ajax({
        type: 'POST',
        url: apiUrl + '/Feedback/Add',
        contentType: 'application/json; charset=utf-8',
        data: ko.toJSON(feedBackData)
    }).done(function (data) {
        self.result("Done!");
    }).fail(showError);

如果控制器方法在API控制器中,它應該接受JSON,模型綁定器將提取值:

public void Add(String screenShot, String versionId, String text)
    {
        String imgId = null;

        if(!String.IsNullOrEmpty(screenShot))
        {
            Byte[] data = Convert.FromBase64String(screenShot);

        // rest of code omitted

抱歉,無法對此語法等進行測試,但應該讓您走上正軌。

調試Knockout頁面的一個好方法是在開發時使用這一行,這樣你就可以看到viewModel中發生了什么:

<pre data-bind="text: ko.toJSON($data, null, 2)"></pre>

有關更多幫助,請參見http://www.knockmeout.net/2013/06/knockout-debugging-strategies-plugin.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM