使用淘汰文件上传文件

发布于 2025-01-17 11:54:55 字数 3067 浏览 2 评论 0原文

我正在尝试使用 knockoutjs 发送由文本和文件类型组成的多部分表单。 有关数据绑定文件的错误。

这是我的 formView:

<div class="form-horizontal">
     <div class="form-group">
           <div class="col-md-12">
            <label class="control-label">Supplier</label>
            <input type="text" name="Supplier" id="Supplier" data-bind="value: Supplier" class="form-control col-md-8 form-control-sm" required />
           </div>
      </div>
      
      <div class="form-group">
           <div class="col-md-12">
             <label class="control-label">Picture</label>
              <input type="file" name="fileInput" id="fileInput" data-bind="file: {data: fileInput, reader: someReader}" class="form-control" />
           </div>
      </div>
</div>

@section scripts {
    <script src="~/Scripts/SDSScripts/RegisterSdsView.js"></script>
}

ViewModel:

function RegisterSdsView() {
    var self = this;
    self.Supplier = ko.observable();
    self.fileInput = ko.observable();
    someReader =  new FileReader();

    self.RegisterSds = function () {
        if (self.errors().length > 0) {
            self.errors.showAllMessages();
            return;
        }
        var Supplier = self.Supplier();
        var fileInput = self.fileInput();
        $.ajax({
            url: '/SdsView/RegisterSds',
            cache: false,
            type: 'POST',
            data: {Supplier, fileInput},
            success: function (data) {
                //some code
            },
            error: function (data) {
               //some code
            }
        });
   }
}

ko.applyBindings(new RegisterSdsView());

Controller:

public ActionResult RegisterSds(string Supplier, HttpPostedFileBase fileInput)
        {
            var db = new SDSDatabaseEntities();
            if (fileInput.ContentLength > 0)
            {

                string fileName = Path.GetFileNameWithoutExtension(fileInput.FileName);
                string fileExtension = Path.GetExtension(fileInput.FileName);
                string path = Path.Combine(Server.MapPath("~/UploadedFiles"), fileName);
                fileInput.SaveAs(path);

                var doc = new SDSDocument()
                {
                    DocName = fileName,
                    DocType = fileExtension,
                    DocPath = path
                };
                db.SDSDocuments.Add(doc);
            }
            db.SaveChanges();
            var result = new { status = "OK" };
            return Json(result, JsonRequestBehavior.AllowGet);
        }

问题是 fileInput(viewModel) 返回 null 到我的控制器(HttpPostedFileBase fileInput)。

我以正确的方式做这些吗? 这实际上是我的第一个 C# .NET 项目。我似乎找不到与 knockoutjs 文件数据绑定相关的好例子。基本上如何将 Based64 POST 到控制器?

这里是我使用的API https://github.com/TooManyBees/knockoutjs-file-binding< /a>

I am trying to send a multipart form consist of text and file type using knockoutjs.
There is an error regarding data-bind file.

Here's my formView:

<div class="form-horizontal">
     <div class="form-group">
           <div class="col-md-12">
            <label class="control-label">Supplier</label>
            <input type="text" name="Supplier" id="Supplier" data-bind="value: Supplier" class="form-control col-md-8 form-control-sm" required />
           </div>
      </div>
      
      <div class="form-group">
           <div class="col-md-12">
             <label class="control-label">Picture</label>
              <input type="file" name="fileInput" id="fileInput" data-bind="file: {data: fileInput, reader: someReader}" class="form-control" />
           </div>
      </div>
</div>

@section scripts {
    <script src="~/Scripts/SDSScripts/RegisterSdsView.js"></script>
}

ViewModel:

function RegisterSdsView() {
    var self = this;
    self.Supplier = ko.observable();
    self.fileInput = ko.observable();
    someReader =  new FileReader();

    self.RegisterSds = function () {
        if (self.errors().length > 0) {
            self.errors.showAllMessages();
            return;
        }
        var Supplier = self.Supplier();
        var fileInput = self.fileInput();
        $.ajax({
            url: '/SdsView/RegisterSds',
            cache: false,
            type: 'POST',
            data: {Supplier, fileInput},
            success: function (data) {
                //some code
            },
            error: function (data) {
               //some code
            }
        });
   }
}

ko.applyBindings(new RegisterSdsView());

Controller:

public ActionResult RegisterSds(string Supplier, HttpPostedFileBase fileInput)
        {
            var db = new SDSDatabaseEntities();
            if (fileInput.ContentLength > 0)
            {

                string fileName = Path.GetFileNameWithoutExtension(fileInput.FileName);
                string fileExtension = Path.GetExtension(fileInput.FileName);
                string path = Path.Combine(Server.MapPath("~/UploadedFiles"), fileName);
                fileInput.SaveAs(path);

                var doc = new SDSDocument()
                {
                    DocName = fileName,
                    DocType = fileExtension,
                    DocPath = path
                };
                db.SDSDocuments.Add(doc);
            }
            db.SaveChanges();
            var result = new { status = "OK" };
            return Json(result, JsonRequestBehavior.AllowGet);
        }

The problem is the fileInput(viewModel) return null to my controller(HttpPostedFileBase fileInput).

Am I doing these the right way?
This is actually my very first C# .NET project. I can't seem to find a good example related to knockoutjs file data-bind. Basically how to POST Based64 to controller?

Here the api that I use https://github.com/TooManyBees/knockoutjs-file-binding

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

阪姬 2025-01-24 11:54:55

好吧,我解决了。我会在这里更新以防万一。基本上我只需通过 FormData 将 Base64 字符串 POST 到控制器即可。我不知道为什么我以前的方法不能发送大字符串值,也许 POST 方法或浏览器对通过 AJAX 发送数据的大小有限制。

这是参考https://stackoverflow.com/a/46864228/13955999

Well I solved it. I gonna update it here just in case. Basically I just have to POST Base64 string to controller via FormData. I don't know why my previous method cannot send large string value, maybe there are limitation on POST method or browser on how large you can send a data via AJAX.

Here is the reference https://stackoverflow.com/a/46864228/13955999

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文