【问题标题】:file upload using knockout js使用淘汰js上传文件
【发布时间】:2015-03-13 12:40:48
【问题描述】:

文件上传无法使用淘汰赛 js。我已经尝试使用下面的代码但没有工作。请指出我做错了什么。

这是我的文件控件和按钮。我无法将选定的文件从客户端发送到服务器。请建议最好的方法是什么。

<input id="files" name="files" type="file" class="input-file" data-bind="file: FileProperties.FileName"/> 
<button data-bind="click : Upload">Upload</button>

<script type="text/javascript">

    ko.bindingHandlers.file = {
        init: function (element, valueAccessor) {
            alert('init');
            $(element).change(function () {
                var file = this.files[0];
                if (ko.isObservable(valueAccessor())) {
                    valueAccessor()(file);
                }
            });
        }
</script>

【问题讨论】:

    标签: javascript c# knockout.js


    【解决方案1】:

    似乎您需要一个自定义敲除绑定来上传文件。有各种可用的 api/libs 可以处理所有带有附加功能的错误情况。 尝试这个: https://github.com/TooManyBees/knockoutjs-file-binding

    【讨论】:

      【解决方案2】:

      我为我当前的项目想出了这个解决方案。

      <img class="myImage" data-bind="attr: {src: $root.photoUrl() || 'images/tempImage.png'}"/>
      <input data-bind="event: {change: $root.fileUpload}" type="file" accept="image/*" class="fileChooser"/>
      
      <script>
      var myController = function()
      {
          var self = this;
          this.photoUrl = ko.observable();      
          this.fileUpload = function(data, e)
          {
              var file    = e.target.files[0];
              var reader  = new FileReader();
      
              reader.onloadend = function (onloadend_e) 
              {
                 var result = reader.result; // Here is your base 64 encoded file. Do with it what you want.
                 self.photoUrl(result);
              };
      
              if(file)
              {
                  reader.readAsDataURL(file);
              }
          };
      };
      </script>
      

      【讨论】:

        【解决方案3】:
        <input type="file" id="FileName" style="width:180px" data-bind="value:addModel.InputFileName" />
        
        function ()
        {
            var files = $("#FileName").get(0).files;
            var data = new FormData();
            for (var x = 0; x < files.length; x++) {
                data.append("file" + x, files[x]);
            }
        
            $.ajax({
                type: "POST",
                url: '/api/Controller' + '/?id=' + id ),
                contentType: false,
                processData: false,
                data: data,
                success: function (result) {},
                error: function (xhr, status, p3, p4) {}
            });
        }
        

        【讨论】:

          【解决方案4】:

          您可以执行以下操作:

          查看:

          <input type="file" id="files" name="files[]" multiple data-bind=" event:{change: $root.fileSelect}" />
          <output id="list"></output>
          
          <ul>    
              <!-- ko foreach: files-->
              <li>
                  <span data-bind ="text: name"></span>: <img class="thumb" data-bind = "attr: {'src': src, 'title': name}"/>
              </li>
              <!-- /ko -->  
          </ul>
          

          JS:

          var ViewModel = function() {
              var self = this;     
              self.files=  ko.observableArray([]);
              self.fileSelect= function (elemet,event) {
                  var files =  event.target.files;// FileList object
          
                  // Loop through the FileList and render image files as thumbnails.
                  for (var i = 0, f; f = files[i]; i++) {
          
                    // Only process image files.
                    if (!f.type.match('image.*')) {
                      continue;
                    }          
          
                    var reader = new FileReader();
          
                    // Closure to capture the file information.
                    reader.onload = (function(theFile) {
                        return function(e) {                             
                            self.files.push(new FileModel(escape(theFile.name),e.target.result));
                        };                            
                    })(f);
                    // Read in the image file as a data URL.
                    reader.readAsDataURL(f);
                  }
              };
          };
          
          var FileModel= function (name, src) {
              var self = this;
              this.name = name;
              this.src= src ;
          };
          
          ko.applyBindings(new ViewModel());
          

          您可以在链接中找到演示: http://jsfiddle.net/fPWFd/436/

          【讨论】:

            【解决方案5】:

            对于 Magento 2,以下代码可用于通过敲除 js 显示上传的图像。

            在html文件中

             <img class="myImage" data-bind="attr: {src: photoUrl() || 'images/tempImage.png'}"/>
             <input data-bind="event: {change: fileUpload}" type="file" accept="image/*" class="fileChooser"/>
            

            js文件需要编码如下

             define(['ko', 'uiComponent', 'jquery'], function (ko, Component, $) {
               'use strict';
                var photoUrl;
                return Component.extend({
                  photoUrl : ko.observable(),
                  fileUpload: function(data, e)
                   {
                      var file    = e.target.files[0];
                      var reader  = new FileReader();
                      reader.onloadend = function (onloadend_e)
                      {
                        var result = reader.result; // Here is your base 64 encoded file. Do with it what you want.
                        self.photoUrl(result);
                      };
                      if(file)
                      {
                        reader.readAsDataURL(file);
                      }
                    },
                  });
              });
            }
            

            以上代码在我的项目中运行良好。

            【讨论】:

            • 欢迎来到 Stack Overflow!虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,纯代码的答案往往不太有用。有关更多信息,请参阅How do I write a good answer?
            猜你喜欢
            • 2015-02-28
            • 1970-01-01
            • 1970-01-01
            • 2013-02-09
            • 1970-01-01
            • 2021-03-09
            • 2016-04-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多