GUAC-1172: Implement file upload through object streams.

This commit is contained in:
Michael Jumper
2015-07-03 13:07:19 -07:00
parent cfd3710bf2
commit daf52dee5e
4 changed files with 62 additions and 4 deletions

View File

@@ -27,6 +27,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
function clientController($scope, $routeParams, $injector) {
// Required types
var ManagedClient = $injector.get('ManagedClient');
var ManagedClientState = $injector.get('ManagedClientState');
var ManagedFilesystem = $injector.get('ManagedFilesystem');
var ScrollState = $injector.get('ScrollState');
@@ -635,6 +636,25 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
ManagedFilesystem.changeDirectory(filesystem, file);
};
/**
* Begins a file upload through the attached Guacamole client for
* each file in the given FileList.
*
* @param {FileList} files
* The files to upload.
*/
$scope.uploadFiles = function uploadFiles(files) {
// Ignore file uploads if no attached client
if (!$scope.client)
return;
// Upload each file
for (var i = 0; i < files.length; i++)
ManagedClient.uploadFile($scope.client, files[i], $scope.filesystemMenuContents);
};
// Clean up when view destroyed
$scope.$on('$destroy', function clientViewDestroyed() {

View File

@@ -171,6 +171,7 @@
<!-- Stationary header -->
<div class="header">
<h2>{{filesystemMenuContents.name}}</h2>
<button class="upload button" guac-upload="uploadFiles">{{'CLIENT.ACTION_UPLOAD_FILES' | translate}}</button>
<button class="back" ng-click="hideFilesystemMenu()">Back</button>
</div>

View File

@@ -438,9 +438,31 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector',
*
* @param {File} file
* The file to upload.
*
* @param {ManagedFilesystem} [filesystem]
* The filesystem to upload the file to, if any. If not specified, the
* file will be sent as a generic Guacamole file stream.
*
* @param {ManagedFilesystem.File} [directory=filesystem.currentDirectory]
* The directory within the given filesystem to upload the file to. If
* not specified, but a filesystem is given, the current directory of
* that filesystem will be used.
*/
ManagedClient.uploadFile = function uploadFile(managedClient, file) {
managedClient.uploads.push(ManagedFileUpload.getInstance(managedClient.client, file));
ManagedClient.uploadFile = function uploadFile(managedClient, file, filesystem, directory) {
// Use generic Guacamole file streams by default
var object = null;
var streamName = null;
// If a filesystem is given, determine the destination object and stream
if (filesystem) {
object = filesystem.object;
streamName = (directory || filesystem.currentDirectory).streamName + '/' + file.name;
}
// Start and manage file upload
managedClient.uploads.push(ManagedFileUpload.getInstance(managedClient.client, file, object, streamName));
};
return ManagedClient;

View File

@@ -124,11 +124,19 @@ angular.module('client').factory('ManagedFileUpload', ['$rootScope', '$injector'
* @param {File} file
* The file to upload.
*
* @param {Object} [object]
* The object to upload the file to, if any, such as a filesystem
* object.
*
* @param {String} [streamName]
* The name of the stream to upload the file to. If an object is given,
* this must be specified.
*
* @return {ManagedFileUpload}
* A new ManagedFileUpload object which can be used to track the
* progress of the upload.
*/
ManagedFileUpload.getInstance = function getInstance(client, file) {
ManagedFileUpload.getInstance = function getInstance(client, file, object, streamName) {
var managedFileUpload = new ManagedFileUpload();
@@ -137,7 +145,14 @@ angular.module('client').factory('ManagedFileUpload', ['$rootScope', '$injector'
reader.onloadend = function fileContentsLoaded() {
// Open file for writing
var stream = client.createFileStream(file.type, file.name);
var stream;
if (!object)
stream = client.createFileStream(file.type, file.name);
// If object/streamName specified, upload to that instead of a file
// stream
else
stream = object.createOutputStream(file.type, streamName);
var valid = true;
var bytes = new Uint8Array(reader.result);