service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if true;
}
}
}
<!DOCTYPE html> <html ng-app="app"><head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"><title page-title></title>
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.16/css/dataTables.bootstrap.min.css" /><style>
body{
font-family:”Open Sans” , sans-serif
}
</style>
</head>
<body>
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">Files</a>
</div>
</div>
</nav><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.6.6/firebase.js"></script>
<script src="https://cdn.firebase.com/libs/angularfire/2.3.0/angularfire.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.16/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/dataTables.bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-datatables/0.6.2/angular-datatables.min.js"></script><script>
// Initialize Firebase
var config = {
apiKey: ********************,
authDomain: ********************,
databaseURL:********************,
projectId: **********************,
storageBucket: **********************,
messagingSenderId: **********************,
};
firebase.initializeApp(config);
</script>
<script src="scripts/app.js"></script>
<script src="scripts/controllers.js"></script>
</body>
</html>
angular.module(app, [
'firebase',
'datatables'
])
<div class="container">
<div ng-controller="UploadCtrl">
<form name="uploadForm" ng-submit="upload()">
<h3>File Uploader</h3>
<div class="input-group">
<input onchange="angular.element(this).scope().onChange(this.files)" class="form-control" type="file" />
<div class="input-group-btn">
<button class="btn btn-default" type="submit">Upload</button>
</div>
</div>
</form>
</div>
</div>
Step2: Create controllers.js and add the following code:
function UploadCtrl($scope, $firebaseStorage, $firebaseObject) {
let fileToUpload = null;
$scope.onChange = function onChange(fileList) {
fileToUpload = fileList[0];
};
$scope.upload = function() {
if (fileToUpload) {
let storageRef = firebase.storage().ref(fileToUpload.name);
let storage = $firebaseStorage(storageRef);
let uploadTask = storage.$put(fileToUpload);
uploadTask.$complete((snapshot) => {
let ref = firebase.database().ref("Files");
let pushKey = ref.push().key;
let formData = $firebaseObject(ref.child(pushKey));
formData.name = fileToUpload.name;
formData.timestamp = firebase.database.ServerValue.TIMESTAMP;
formData.url = snapshot.downloadURL;
formData.$save().then(() => {
angular.element("input[type='file']").val(null);
fileToUpload = null;
})
});
}
}
}
angular
.module('app')
.controller('UploadCtrl', UploadCtrl)
Explanation:
let fileToUpload = null;
$scope.onChange = function onChange(fileList) {
fileToUpload = fileList[0];
};
$scope.upload = function() {
if (fileToUpload) {
let storageRef = firebase.storage().ref(fileToUpload.name);
let storage = $firebaseStorage(storageRef);
let uploadTask = storage.$put(fileToUpload);
uploadTask.$complete((snapshot) => {
let ref = firebase.database().ref("Files");
let pushKey = ref.push().key;
let formData = $firebaseObject(ref.child(pushKey));
formData.name = fileToUpload.name; formData.timestamp = firebase.database.ServerValue.TIMESTAMP; formData.url = snapshot.downloadURL;
formData.$save().then(() => {
angular.element("input[type='file']").val(null);
fileToUpload = null;
})
Step1: Add this to index.html, after div for UploadCtrl.
<div ng-controller="tableCtrl">
<h3>Uploaded Files</h3>
<table datatable="ng" class="table row-border table-striped table-hover compact display">
<thead>
<tr>
<th>Upload Date</th>
<th>Name</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="(key,value) in files">
<td>{{value.timestamp | date}}</td>
<td>{{value.name}}</td>
<td>
<a href="{{value.url}}" class="btn btn-default" target="_blank">Download</a>
<a href="#" class="btn btn-default" ng-click="delete(key, value.name)">Delete</a>
</td>
</tr>
</tbody>
</table>
</div>
Here we have setup a datatable showing the upload date, file name and buttons to download or delete a file. File details are shown from files object created in tableCtrl.
Step2: Create tableCtrl in controllers.js
function tableCtrl($scope, $firebaseStorage, $firebaseObject){
let fileRef = firebase.database().ref('Files');
$scope.files = $firebaseObject(fileRef);
$scope.delete = (key, name) => {
let storageRef = firebase.storage().ref(name);
let storage = $firebaseStorage(storageRef);
storage.$delete().then(() => {
delete $scope.files[key];
$scope.files.$save();
})
}
}
angular
.module('app')
.controller('UploadCtrl', UploadCtrl)
.controller('tableCtrl', tableCtrl)
Explanation:
function tableCtrl($scope, $firebaseStorage, $firebaseObject){
let fileRef = firebase.database().ref('Files');
let storageRef = firebase.storage().ref();
$scope.files = $firebaseObject(fileRef);
$scope.delete = (key, name) => {
let storageRef = firebase.storage().ref(name);
let storage = $firebaseStorage(storageRef);
storage.$delete().then(() => {
delete $scope.files[key];
$scope.files.$save();
})
}