'how to properly use angular-file-upload on a page
I need to use angular-file-upload directive (https://github.com/nervgh/angular-file-upload).
I took the html as well as the controller example as-is from github:
html:
<body ng-controller="GeekController" nv-file-drop="" uploader="uploader" filters="queueLimit, customFilter">
<div class="container">
<div class="navbar navbar-default">
<div class="navbar-header">
<a class="navbar-brand" href="https://github.com/nervgh/angular-file-upload">Angular File Upload</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Demos <b class="caret"></b></a>
<ul class="dropdown-menu">
<li class="active"><a href="#">Simple example</a></li>
</ul>
</li>
<li><a href="https://github.com/nervgh/angular-file-upload">View on Github</a></li>
<li><a href="https://raw.github.com/nervgh/angular-file-upload/master/angular-file-upload.min.js">Download</a></li>
</ul>
</div>
</div>
<div class="row">
<div class="col-md-3">
<h3>Select files</h3>
<div ng-show="uploader.isHTML5">
<!-- 3. nv-file-over uploader="link" over-class="className" -->
<div class="well my-drop-zone" nv-file-over="" uploader="uploader">
Base drop zone
</div>
<!-- Example: nv-file-drop="" uploader="{Object}" options="{Object}" filters="{String}" -->
<div nv-file-drop="" uploader="uploader" options="{ url: '/foo' }">
<div nv-file-over="" uploader="uploader" over-class="another-file-over-class" class="well my-drop-zone">
Another drop zone with its own settings
</div>
</div>
</div>
<!-- Example: nv-file-select="" uploader="{Object}" options="{Object}" filters="{String}" -->
Single
<input type="file" nv-file-select="" uploader="uploader" />
</div>
<div class="col-md-9" style="margin-bottom: 40px">
<h3>Upload queue</h3>
<p>Queue length: {{ uploader.queue.length }}</p>
<table class="table">
<thead>
<tr>
<th width="50%">Name</th>
<th ng-show="uploader.isHTML5">Size</th>
<th ng-show="uploader.isHTML5">Progress</th>
<th>Status</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in uploader.queue">
<td><strong>{{ item.file.name }}</strong></td>
<td ng-show="uploader.isHTML5" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>
<td ng-show="uploader.isHTML5">
<div class="progress" style="margin-bottom: 0;">
<div class="progress-bar" role="progressbar" ng-style="{ 'width': item.progress + '%' }"></div>
</div>
</td>
<td class="text-center">
<span ng-show="item.isSuccess"><i class="glyphicon glyphicon-ok"></i></span>
<span ng-show="item.isCancel"><i class="glyphicon glyphicon-ban-circle"></i></span>
<span ng-show="item.isError"><i class="glyphicon glyphicon-remove"></i></span>
</td>
<td nowrap>
<button type="button" class="btn btn-success btn-xs" ng-click="item.upload()" ng-disabled="item.isReady || item.isUploading || item.isSuccess">
<span class="glyphicon glyphicon-upload"></span> Upload
</button>
<button type="button" class="btn btn-warning btn-xs" ng-click="item.cancel()" ng-disabled="!item.isUploading">
<span class="glyphicon glyphicon-ban-circle"></span> Cancel
</button>
<button type="button" class="btn btn-danger btn-xs" ng-click="item.remove()">
<span class="glyphicon glyphicon-trash"></span> Remove
</button>
</td>
</tr>
</tbody>
</table>
<div>
<div>
Queue progress:
<div class="progress" style="">
<div class="progress-bar" role="progressbar" ng-style="{ 'width': uploader.progress + '%' }"></div>
</div>
</div>
<button type="button" class="btn btn-success btn-s" ng-click="uploader.uploadAll()" ng-disabled="!uploader.getNotUploadedItems().length">
<span class="glyphicon glyphicon-upload"></span> Upload all
</button>
<button type="button" class="btn btn-warning btn-s" ng-click="uploader.cancelAll()" ng-disabled="!uploader.isUploading">
<span class="glyphicon glyphicon-ban-circle"></span> Cancel all
</button>
<button type="button" class="btn btn-danger btn-s" ng-click="uploader.clearQueue()" ng-disabled="!uploader.queue.length">
<span class="glyphicon glyphicon-trash"></span> Remove all
</button>
</div>
</div>
</div>
</div>
</body>
Controller:
angular.module('GeekCtrl', ['angularFileUpload'])
.controller('GeekController', ['$scope', 'FileUploader', function($scope, FileUploader) {
var uploader = $scope.uploader = new FileUploader({
url: 'upload.php'
});
// FILTERS
uploader.filters.push({
name: 'customFilter',
fn: function(item /*{File|FileLikeObject}*/, options) {
return this.queue.length < 10;
}
});
// CALLBACKS
uploader.onWhenAddingFileFailed = function(item /*{File|FileLikeObject}*/, filter, options) {
console.info('onWhenAddingFileFailed', item, filter, options);
};
uploader.onAfterAddingFile = function(fileItem) {
console.info('onAfterAddingFile', fileItem);
};
uploader.onAfterAddingAll = function(addedFileItems) {
console.info('onAfterAddingAll', addedFileItems);
};
uploader.onBeforeUploadItem = function(item) {
console.info('onBeforeUploadItem', item);
};
uploader.onProgressItem = function(fileItem, progress) {
console.info('onProgressItem', fileItem, progress);
};
uploader.onProgressAll = function(progress) {
console.info('onProgressAll', progress);
};
uploader.onSuccessItem = function(fileItem, response, status, headers) {
console.info('onSuccessItem', fileItem, response, status, headers);
};
uploader.onErrorItem = function(fileItem, response, status, headers) {
console.info('onErrorItem', fileItem, response, status, headers);
};
uploader.onCancelItem = function(fileItem, response, status, headers) {
console.info('onCancelItem', fileItem, response, status, headers);
};
uploader.onCompleteItem = function(fileItem, response, status, headers) {
console.info('onCompleteItem', fileItem, response, status, headers);
};
uploader.onCompleteAll = function() {
console.info('onCompleteAll');
};
console.info('uploader', uploader);
}]);
When I run this, I get the following error:
"Error: "Uploader" must be an instance of FileUploader
.link@http://localhost:8080/libs/angular/AngularFileUpload.js:1231:25
$@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:70:197
B@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:59:255
g@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:51:335
B@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:59:196
g@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:51:335
g@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:51:335
g@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:51:335
g@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:51:335
D/<@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:50:441
ngViewFillContentFactory/<.link@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-route.js:983:7
$@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:70:197
B@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:59:255
g@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:51:335
D/<@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:50:441
P/<@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:52:379
k@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:56:315
update@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-route.js:933:17
Pe/this.$get</n.prototype.$broadcast@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:128:355
commitRoute/<@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-route.js:616:15
f/<@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:112:98
Pe/this.$get</n.prototype.$eval@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:126:4
Pe/this.$get</n.prototype.$digest@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:123:98
Pe/this.$get</n.prototype.$apply@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:126:291
l@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:81:227
M@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:85:342
wf/</F.onload@http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js:86:367
" "<div class="well my-drop-zone" nv-file-over="" uploader="uploader">"
What do I need to change to make this work properly?
Solution 1:[1]
In html use {{uploader}} to acces the uploader of the controller or alternatively do a $scope.uploader= new FileUplader(...) in the controller
Solution 2:[2]
this is similiar to "Uploader" must be an instance of FileUploader
You can use the directive ng-if in your div
<div class="well my-drop-zone" ng-if="uploader" nv-file-over="" uploader="uploader">
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | choosyg |
Solution 2 | Community |