2

私は Web 開発の初心者で、ファイルをデータベースに保存するときに問題があります。私はMVC 4、knockoutjs 2.3.0、jquery 2.03、およびamplifyjs 1.1.0を使用しています。

これが私がやりたい方法です。

私のアップロードページにはフォームがあります:

<form id="uploadForm" name="uploadForm" action="~/Administration/UploadReports"       method="post" enctype="multipart/form-data">
    <input required type="file" name="fileToUpload" id="fileToUpload" accept="html, image/jpeg">
        <input type="submit" data-bind="click:submit" value="Ladda upp fil" />
        <input type="reset" value="Avbryt" />
    </form>

次に、私の knockoutViewModel には、以下のコードがあります。

 this.submit = function (model, element) {
                var test = $('#uploadForm')[0];
                var formData = new FormData(test);

                amplify.request({
                    resourceId: "uploadReport",
                    success: () => {
                        console.log("success");
                    },
                    error: () => {
                        console.log("error");
                    },
                    data: formData 
                });                   
            };

これまでのところ、すべてが正常に機能しています。フォームのボタンを押すと、ここに行き着きます。しかし、amplifyjs は私の dataForm で何かをしていると思います... Amplify.request は次のように定義されています。

amplify.request.define('uploadReport', 'AJAX', {
    url: '/Administration/UploadReports',
    type: 'POST',
    contentType: false,
    processData: false,
    cache: false
});

そして、私のコントローラーでは次のようになります。

    [HttpPost]
    public ActionResult UploadReports(HttpPostedFileBase fileToUpload)
    {

        //Update the list of files
        var model = new AdministrationViewModel();

        byte[] result;

        using (var streamReader = new MemoryStream())
        {
            fileToUpload.InputStream.CopyTo(streamReader);
            result = streamReader.ToArray();
        }

        model.BetFiles = FileInserter.InsertFile(fileToUpload.FileName, fileToUpload.ContentType, fileToUpload.ContentLength, result).Value;


        return View("Reports", model);
    }

問題が何であるかを理解するのを手伝ってくれる人はいますか?

よろしく、デビッド


ここに私が得るものがあります:

ここに画像の説明を入力

そして、これは私が期待したものです:

ここに画像の説明を入力

4

2 に答える 2

1

現在、amplify.js はバージョン 1.1.2 の FormData をサポートしていません。

この問題を確認して ください https://github.com/appendto/amplify/issues/107

考えられる解決策は、このイベント サブスクリプションでライブラリを変更することです

amplify.subscribe( "request.ajax.preprocess", function(defnSettings, settings, ajaxSettings) {
        var mappedKeys = [],
            data = ajaxSettings.data;

        if (typeof data === "string" || Object.prototype.toString.call(data) === "[object FormData]") {
            return;
        }
......(omited)
)}

そうすれば、増幅は、渡されたオブジェクトがネイティブの FormData オブジェクトである場合に無視します。jQuery が FormData オブジェクトを再び混乱させないように、要求定義の設定に含める必要があります。

contentType: false
cache: false
processData: false
于 2015-02-07T17:05:00.920 に答える
0

ノックアウトビューモデルの this.submit 関数を以下のコードに変更すると、正常に機能しますが、これを取得するために増幅を使用したいと考えています。

 this.submit = function (model, element) {
                var test = $('#uploadForm')[0];

                var formURL = formObj.attr("action");
                var formData = new FormData(test);

                $.ajax({
                    url: formURL,
                    type: 'POST',
                    data: formData,
                    mimeType: "multipart/form-data",
                    contentType: false,
                    cache: false,
                    processData: false,
                    success: function (data, textStatus, jqXHR) {

                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                    }
                });

            };

そしてもちろん、コントローラーメソッドでは次を返す必要があります。

return Json(model.BetFiles);

ビューの代わりに。

于 2014-03-19T16:31:48.570 に答える