0

我想在Angular js/MVC中实现简单的文件拖放功能。Angular js/MVC中的文件拖放功能不起作用

我创建了一个拖放指令。

(function (angular, undefined) { 
 
    'use strict'; 
 

 
    angular.module('fileupload', []) 
 
    .directive("myDirective", function ($parse) { 
 
     return { 
 
      restrict: 'A', 
 
      link: fileDropzoneLink 
 
     }; 
 
     function fileDropzoneLink(scope, element, attrs) { 
 
      element.bind('dragover', processDragOverOrEnter); 
 
      element.bind('dragenter', processDragOverOrEnter); 
 
      element.bind('dragend', endDragOver); 
 
      element.bind('dragleave', endDragOver); 
 
      element.bind('drop', dropHandler); 
 

 
      var onImageDrop = $parse(attrs.onImageDrop); 
 

 
      //When a file is dropped 
 
      var loadFile = function (files) { 
 
       scope.uploadedFiles = files; 
 
       scope.$apply(onImageDrop(scope)); 
 
      }; 
 

 
      function dropHandler(angularEvent) { 
 
       var event = angularEvent.originalEvent || angularEvent; 
 
       var files = event.dataTransfer.files; 
 
       event.preventDefault(); 
 
       loadFile(files) 
 
      } 
 

 
      function processDragOverOrEnter(angularEvent) { 
 
       var event = angularEvent.originalEvent || angularEvent; 
 
       if (event) { 
 
        event.preventDefault(); 
 
       } 
 
       event.dataTransfer.effectAllowed = 'copy'; 
 
       element.addClass('dragging'); 
 
       return false; 
 
      } 
 

 
      function endDragOver() { 
 
       element.removeClass('dragging'); 
 
      } 
 
     } 
 
    }); 
 
}(angular));

这是模板

<div class="dropzone" data-my-Directive on-image-drop="$ctrl.fileDropped()"> 
 
Drag and drop pdf files here 
 
</div>

这是我的组件代码

(function (angular, undefined) { 
 
    'use strict'; 
 

 
    angular.module('test', []) 
 
     .component('contactUs', contactUs()); 
 

 
    function contactUs() { 
 
     ContactUs.$inject = ['$scope', '$http']; 
 
     function ContactUs($scope, $http) { 
 
      var ctrl = this; 
 
      ctrl.files = []; 
 
      
 
      ctrl.services = { 
 
       $scope: $scope, 
 
       $http: $http, 
 
      }; 
 
     } 
 

 
     //file dropped 
 
     ContactUs.prototype.fileDropped = function() { 
 
      var ctrl = this; 
 
      var files = ctrl.services.$scope.uploadedFiles; 
 
      angular.forEach(files, function (file, key) { 
 
       ctrl.files.push(file); 
 
      }); 
 
     } 
 

 

 
     return { 
 
      controller: ContactUs, 
 
      templateUrl: 'partials/home/contactus/' 
 
     }; 
 
    } 
 
}(angular));

有时拖放作品精绝没有任何问题。但是有时候我会遇到下面的问题,拖放不起作用,我得到黑色的无效光标。

enter image description here

这个问题是随机的,我没有看到在控制台中的任何错误。

而且我也尝试像其他第三方组件角文件上传 https://github.com/nervgh/angular-file-upload,我看到与该组件完全相同的问题也。

回答

0

编辑:

回答更新的PDF格式预览。该代码在同一个plunker中可用。

参考文献:在https://stackoverflow.com/a/21732039/6347317

在上面的例子由@迈克尔优良的解决方案,从HTTP POST的响应中所用的“新斑点([反应]”以角文件上传库中,“。响应“将是”uploader.onAfterAddingFile“函数中的”fileItem._file“属性。您可以通过控制台日志来检查这些数据,以便更好地理解它。

也请注意,如果PDF阅读器无法启用Chrome,它必须使用此启用:https://support.google.com/chrome/answer/6213030?hl=en

编辑完

既然你提到你试图用角文件-upload图书馆,我创建了一个plunker它:

http://plnkr.co/edit/jeYg5fIRaC9wuEYSNOux?p=info

HTML:

<!DOCTYPE html> 
    <html ng-app="plunker"> 
     <head> 
     <meta charset="utf-8" /> 
     <title>AngularJS Plunker</title> 
     <script>document.write('<base href="' + document.location + '" />');</script> 
      <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" /> 
     <link rel="stylesheet" href="style.css" /> 
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
     <script data-require="[email protected]" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.11/angular.min.js" data-semver="1.5.11"></script> 
     <script src="http://netdna.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-file-upload/2.5.0/angular-file-upload.min.js"></script> 
     <script src="app.js"></script> 
     </head> 

     <body ng-controller="MainCtrl"> 
         <div class="col-sm-4"> 

         <h3>Select files</h3> 

         <div ng-show="uploader.isHTML5"> 
          <!-- 3. nv-file-over uploader="link" over-class="className" --> 
          <div class="well my-drop-zone" style="width:300px" nv-file-drop nv-file-over="" uploader="uploader" 
          filters="syncFilter"> 
           <label> 
           Click here or Drag and Drop file 
           <input type="file" style="visibility:hidden;" nv-file-select nv-file-over="" uploader="uploader" 
           filters="syncFilter" multiple/> 
           </label> 
            <div class="progress" style="margin-bottom: 0;"> 
            <div class="progress-bar" role="progressbar" ng-style="{ 'width': uploader.queue[0].progress + '%' }"></div> 
            </div> 
           <div>{{uploader.queue[0].file.name}}</div> 

            <div ng-show="showAlert" class="alert alert-warning alert-dismissable"> 
            <a href="#" class="close" data-dismiss="alert" aria-label="close">×</a> 
            <strong>Clear the existing file before uploading again!!</strong> 
            </div> 
          </div> 

         </div> 
         </div> 

     </body> 

    </html> 

JS:

var app = angular.module('plunker', ['angularFileUpload']); 

app.controller('MainCtrl', function($scope,FileUploader) { 
var uploader = $scope.uploader = new FileUploader(); 

     // FILTERS 

     // a sync filter 
     uploader.filters.push({ 
      name: 'syncFilter', 
      fn: function(item /*{File|FileLikeObject}*/, options) { 
       console.log('syncFilter' + this.queue.length); 
       return this.queue.length < 1; 
      } 
     }); 

     // an async filter 
     uploader.filters.push({ 
      name: 'asyncFilter', 
      fn: function(item /*{File|FileLikeObject}*/, options, deferred) { 
       console.log('asyncFilter'); 
       setTimeout(deferred.resolve, 1e3); 
      } 
     }); 


uploader.allowNewFiles = true; 
uploader.filters.push({ 
    name:'csvfilter', 
    fn: function() { 
    return this.allowNewFiles; 
} 
}); 

     // CALLBACKS 

     uploader.onWhenAddingFileFailed = function(item /*{File|FileLikeObject}*/, filter, options) { 
      console.info('onWhenAddingFileFailed', item, filter, options); 
      $scope.showAlert=true; 
     }; 


     uploader.onAfterAddingFile = function(fileItem) { 

    }; 
}); 

这是很简单的,我不给你提到的错误。我们实际上是在我们的一个项目中使用这个库。我还添加了一个过滤器来限制上传到只有1个文件。

请检查这,让我知道如何去或者如果你有代码中的任何疑虑。

+0

感谢维杰但我仍然看到了同样的问题,我注意到,当我尝试运行的代码在普通的HTML文件,并没有VisualStudio中运行/ IIS中的文件被删除的网页上,它的作品,但我当在visual studio/iis中运行相同的代码我看到上面的奇怪问题 –

+0

噢好吧。然后它可能是Visula studio中的一些设置。如何在Visual Studio中打开网页?看到这个链接:https://stackoverflow.com/questions/15226600/visual-studio-does-not-let-me-drag-drop-items-into-it –

+0

不知道这是它,但你可以请看看在帖子底部的解决方案。可能只是Visual Studio的是Visual Studio中: https://www.devexpress.com/Support/Center/Question/Details/T520060/dxfileuploader-drag-and-drop-is-not-working-in-ie11-when -running-a-web-project-in-visual –