【问题标题】:file uploader integration for angularjs [closed]angularjs的文件上传器集成[关闭]
【发布时间】:2012-10-10 09:22:19
【问题描述】:

是否存在与 AngularJS 良好集成(指令)的良好文件上传器?

我正在寻找易于设置样式并支持 HTML5 拖放等的东西。

有人可能会说它很容易使用现有的上传器并将其集成到 AngularJS 中 - 我会说:如果它很容易,那么应该有人已经做到了。

【问题讨论】:

  • jsfiddle.net/danielzen/utp7j 你不知道 Giuthub 页面展示了一些基本流程的好例子吗:github.com/angular/angular.js/wiki/JSFiddle-Examples
  • @Spir 虽然它可能有效,但这并不是 Angular 工作的最佳示例。它将依赖注入抛出窗口,并且在控制器内部进行大量的 DOM 操作和事件绑定。
  • +29、27 星。 “关闭为题外话”。
  • 当我问这个问题时,没有 Angular 的文件上传器。所以当时它并没有离题,即使现在它似乎对人们仍然很有用。
  • mkoryak - 我很确定@Quibblesome 实际上是在挖掘“新的”超级严格且因此不那么有用的网站政策,而不是在您的问题上。

标签: file-upload angularjs


【解决方案1】:

实际上,我曾经推出过自己的上传器……但只是因为我不喜欢任何已经制作的 JQuery 上传器。不幸的是,这是专有的,我不能在互联网上发布它......但是......我可以向您展示如何使用来自 Angular 的任何 JQuery 插件:

有人可能会说它很容易使用现有的上传器并将其集成到 AngularJS 中 - 我会说:如果它很容易,那么应该有人已经做到了。

假设我有一个 jQuery 插件,它通过选择一个 div 并在其上调用 pluginUploadCall()...

app.directive('myJqueryPluginUploader', function() {
   return {
      restrict: 'A',
      link: function(scope, elem, attr, ctrl) {
          // elem is a jQuery lite object
          // or a jQuery object if jQuery is present.
          // so call whatever plugins you have.
          elem.pluginUploadCall();
      }
   };
});

这就是它的使用方法。

<div my-jquery-plugin-uploader></div>

Angular 实际上与 jQuery 集成得非常好,因此任何在 jQuery 中工作的插件都应该在 Angular 中很容易地工作。当你想让依赖注入保持活跃时,唯一的技巧就出现了,这样你就可以让你的 Angular 应用程序保持可测试性。 JQuery 不太擅长 DI,因此您可能需要跳过一些障碍。

如果你想自己动手,我可以告诉你我做了这样的事情:

app.directive('customUploader', function(){
    return {
       restrict: 'E',
       scope: {},
       template: '<div class="custom-uploader-container">Drop Files Here<input type="file" class="custom-uploader-input"/><button ng-click="upload()" ng-disabled="notReady">Upload</button></div>',
       controller: function($scope, $customUploaderService) {
          $scope.notReady = true;
          $scope.upload = function() {
             //scope.files is set in the linking function below.
             $customUploaderService.beginUpload($scope.files);
          };
          $customUploaderService.onUploadProgress = function(progress) {
             //do something here.
          };
          $customUploaderService.onComplete = function(result) {
             // do something here.
          };
       },
       link: function(scope, elem, attr, ctrl) {
          fileInput = elem.find('input[type="file"]');
          fileInput.bind('change', function(e) {               
               scope.notReady = e.target.files.length > 0;
               scope.files = [];
               for(var i = 0; i < e.target.files.length; i++) {
                   //set files in the scope
                   var file = e.target.files[i];
                   scope.files.push({ name: file.name, type: file.type, size: file.size });
               }
          });
       }
});

其中$customUploaderService 将是您使用Module.factory() 创建的自定义服务,它使用$http 发布文件并检查服务器上的进度。

我知道这很含糊,很抱歉,我只能提供这些,但我希望这会有所帮助。

编辑:拖放文件上传有点 CSS 的技巧,顺便说一句......对于 Chrome 和 FF,你所做的就是把它放在一个包含 div 中......然后做这样的事情:

<div class="uploadContainer">Drop Files Here<input type="file"/></div>
div.uploadContainer {
   position: relative;
   width: 600px;
   height: 100px;
}

div.uploadContainer input[type=file] {
   visibility: hidden;
   position: absolute;
   top: 0;
   bottom: 0;
   left: 0;
   right: 0;
}

...现在,您在该 div 上放置的任何内容都将真正在文件上传时被删除,您可以使 div 看起来像您想要的任何东西。

【讨论】:

  • 感谢您到目前为止回答了我几乎所有的 angluarjs 问题。一旦我完成它们,我就会接受它们:) 这个信息真的很好,因为我刚刚开始并且没有太多可用的
  • 大声笑...我没有意识到我已经做到了。我真的很喜欢 Angular,我认为缺少文档,所以我想帮忙。
  • angular 看起来真的很有趣。我希望我没有忘记我所知道的关于编写客户端代码来使用它的所有知识......但我想这通常是多么有趣的事情。
  • 嗯,在我看来,问题在于十多年来,人们并没有把 JavaScript 当作一种编程语言来对待。这就是为什么直到最近我们还没有看到太多这样的框架。我的意思是,我记得那些不惜一切代价避免使用 JS 的时代,因为浏览器之间无法正常工作。或者见鬼,人们只是把它关掉了。
  • 好的,还有一个问题。你如何发布文件? $http 使用 ajax,你不能使用 ajax 文件。我可以使用 iframe 或文件上传器库来解决它,但实际上是否有一种角度方式来进行文件上传而无需求助于这些东西(适用于 ie7+)
【解决方案2】:

你可以试试AngularJS.ngUpload

这是一个不使用 HTML5 的解决方案,它使用不可见的 iFrame 进行文件上传。由于它不依赖 HTML5,它可以跨浏览器运行!

示例代码:

<form action='/server/upload/handler' ng-upload="callbackFunction">
   <!-- other form inputs goes here -->
   <input type="file" name="anyEasyName" />
   <input type="submit" class="upload-submit" value="Submit" />
</form>
<div>{{uploadReport}}</div>

任何支持点击事件的 html 元素都可以用来提交带有 ngUpload 指令标记的表单,只是这些元素必须使用 upload-submit css 类进行标记(与上面的输入[type=submit]。

以下示例使用样式化的 div 提交表单。

<form action='/server/upload/handler' ng-upload="callbackFunction">
   <!-- other form inputs goes here -->
   <input type="file" name="anyEasyName" />
   <div style="cursor: pointer; padding: 5px" class="upload-submit">Submit</div>
</form>
<div>{{uploadReport}}</div>

你可以让你的 /server/upload/handler 吐出一个有效的 url,这样 {{uploadReport}} 就可以用来设置 标签的 src,像这样:

<img ng-src={{uploadReport}} />

并看到上传的图像立即出现!

上面例子的ngController是:

var UploadCtrl = function ($scope) {
     $scope.callbackFunction = function(contentOfInvisibleFrame) {
         $scope.uploadReport = contentOfInvisibleFrame;
     }
}

ngUpload 指令可以注册到您的 AngularJS 应用程序模块中,即:

var mainApp = angular.module('MainApp', ["ngUpload", ...]);

并添加到您的文档中:

<html ng-app="MainApp">

</html>

AngularJS.ngUpload 在 ngController 的上下文中工作;这样您就可以在单个 ngController 中拥有尽可能多的上传者。例如:

<form action='/server/upload/handler' ng-upload="callbackFunction1">
   <!-- other form inputs goes here -->
   <input type="file" name="anyEasyName" />
   <input type="submit" class="upload-submit" value="Submit" />
</form>
Server response: {{uploadReport1}}

<form action='/server/upload/handler' ng-upload="callbackFunction2">
   <!-- other form inputs goes here -->
   <input type="file" name="anotherEasyName" />
   <input type="submit" class="upload-submit" value="Submit" />
</form>
Server response: {{uploadReport2}}

服务对象:

var UploadCtrl = function ($scope) {
     $scope.callbackFunction1 = function(contentOfInvisibleFrame) {
         $scope.uploadReport1 = contentOfInvisibleFrame;
     }

     $scope.callbackFunction2 = function(contentOfInvisibleFrame) {
         $scope.uploadReport2 = contentOfInvisibleFrame;
     }
}

此指令的基于 NodeJS 的上传处理程序演示可以在 http://ng-upload.eu01.aws.af.cm 找到。

可以在项目网站 github.com/twilson63/ngUpload/tree/master/examples 上找到 ASP.Net MVC 和 NodeJS 示例代码

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    我在这里为不支持 HTML5 FormData 的浏览器编写了一个简单/轻量级的带有 polyfill 的指令:

    https://github.com/danialfarid/ng-file-upload

    您可以将其他模型对象与文件一起发送到服务器。 这是演示页面:

    http://angular-file-upload.appspot.com/

    <script src="angular.min.js"></script>
    <script src="ng-file-upload.js"></script>
    
    <div ng-controller="MyCtrl">
      <input type="text" ng-model="myModelObj">
      <input type="file" ngf-select ng-model="files" >
    </div>
    

    控制器:

    Upload.upload({
        url: 'my/upload/url',
        data: {myObj: $scope.myModelObj},
        file: $scope.files
      }).then(function(data, status, headers, config) {
        // file is uploaded successfully
        console.log(data);
      }); 
    

    【讨论】:

    • 如何在提交按钮上开始上传?
    • 在提交按钮 ng-click 上调用 js 部分。我已经更新了代码,因为新版本支持 ng-model 指令。
    【解决方案4】:

    如果你想处理多个文件,试试这个

    jQuery File Upload Angularjs wrap来自原作者(blueimp)

    我认为它是迄今为止最强大的上传器。

    【讨论】:

      【解决方案5】:

      我最近写了一个支持原生多文件上传的指令。

      示例用法:

      <lvl-file-upload
          auto-upload='false'
          choose-file-button-text='Choose files'
          upload-file-button-text='Upload files'
          upload-url='http://localhost:3000/files'
          max-files='10'
          max-file-size-mb='5'
          get-additional-data='getData(files)'
          on-done='done(files, data)'
          on-progress='progress(percentDone)'
          on-error='error(files, type, msg)'/>
      

      您可以找到code on github,以及my blog 上的文档

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 2020-12-28
        相关资源
        最近更新 更多