[pve-devel] r4918 - in pve-manager/pve2: lib/PVE lib/PVE/API2 www/css www/manager

svn-commits at proxmox.com svn-commits at proxmox.com
Tue Jul 20 14:23:55 CEST 2010


Author: dietmar
Date: 2010-07-20 12:23:55 +0000 (Tue, 20 Jul 2010)
New Revision: 4918

Modified:
   pve-manager/pve2/lib/PVE/API2/Storage.pm
   pve-manager/pve2/lib/PVE/REST.pm
   pve-manager/pve2/www/css/ext-pve.css
   pve-manager/pve2/www/manager/Makefile.am
   pve-manager/pve2/www/manager/StorageBrowser.js
Log:
implement file upload - first try ;-)


Modified: pve-manager/pve2/lib/PVE/API2/Storage.pm
===================================================================
--- pve-manager/pve2/lib/PVE/API2/Storage.pm	2010-07-20 06:14:10 UTC (rev 4917)
+++ pve-manager/pve2/lib/PVE/API2/Storage.pm	2010-07-20 12:23:55 UTC (rev 4918)
@@ -434,6 +434,63 @@
     }});
 
 __PACKAGE__->register_method ({
+    name => 'upload_content', 
+    # /storage/content/{nodeid}/{storeid}
+    path => 'content/{node}/{storage}',
+    method => 'POST',
+    description => "Upload content.",
+    parameters => {
+    	additionalProperties => 0,
+	properties => { 
+	    node => {
+		type => 'string',		
+	    },
+	    storage => {
+		type => 'string',		
+	    },
+	    upload => {
+		type => 'string',		
+	    },
+	},
+    },
+    returns => { type => 'null' },
+    code => sub {
+	my ($conn, $resp, $param) = @_;
+
+	my $cts = $param->{content} ? [ $param->{content} ] : [ @ctypes ];
+
+	my $node = $param->{node};
+	my $storeid = $param->{storage};
+	my $filename = $param->{upload};
+	my $fh = CGI::upload('upload') || die "unable to get file handle\n";
+
+	syslog ('info', "UPLOAD $filename to $node $storeid");
+	
+	die "upload not implemented\n";
+
+	my $buffer = "";
+	my $tmpname = "/tmp/proxmox_upload-$$.bin";
+
+	eval {
+	    open FILE, ">$tmpname" || die "can't open temporary file '$tmpname' - $!\n";
+	    while (read($fh, $buffer, 32768)) {
+		die "write failed - $!" unless print FILE $buffer;
+	    }
+	    close FILE || die " can't close temporary file '$tmpname' - $!\n";
+	};
+	my $err = $@;
+
+	if ($err) {
+	    unlink $tmpname;
+	    die $err;
+	}
+
+	unlink $tmpname; # fixme: proxy to local host import
+
+	return undef;
+    }});
+
+__PACKAGE__->register_method ({
     name => 'list_status', 
     protected => 1,
     # /storage/status/{nodeid}

Modified: pve-manager/pve2/lib/PVE/REST.pm
===================================================================
--- pve-manager/pve2/lib/PVE/REST.pm	2010-07-20 06:14:10 UTC (rev 4917)
+++ pve-manager/pve2/lib/PVE/REST.pm	2010-07-20 12:23:55 UTC (rev 4918)
@@ -116,6 +116,10 @@
     } elsif ($format eq 'extjs') {
 	$ct = 'application/json';
 	$raw = to_json($data, {utf8 => 1, allow_nonref => 1});
+    } elsif ($format eq 'htmljs') {
+	# we use this for extjs file upload forms
+	$ct = 'text/html';
+	$raw =  encode_entities(to_json($data, {utf8 => 1, allow_nonref => 1}));
     } else {
 	$ct = 'text/plain';
 	$raw = to_json($data, {utf8 => 1, allow_nonref => 1, pretty => 1});
@@ -136,7 +140,7 @@
 	$new->{errors} = $res->{errors};
     };
 
-    if ($format eq 'extjs') {
+    if ($format eq 'extjs' || $format eq 'htmljs') {
 	# HACK: extjs wants 'success' property instead of useful HTTP status codes
 	if (is_error($res->{status})) {
 	    $success = 0;
@@ -274,7 +278,7 @@
 
     return { status => HTTP_UNAUTHORIZED } if !($ticket && $username);
 
-    syslog ('info', "GOT VALID TICKET $ticket");
+    syslog ('info', "GOT $method $abs_uri VALID TICKET $ticket");
     
     my $stack = [ grep { length($_) > 0 }  split('\/+' , $rel_uri)] ; # skip empty fragments
     my $uri_param = {};
@@ -321,7 +325,7 @@
 sub split_abs_uri {
     my ($abs_uri) = @_;
 
-    my ($format, $rel_uri) = $abs_uri =~ m/^\Q$baseuri\E\/+(html|json|extjs)(\/.*)?$/;
+    my ($format, $rel_uri) = $abs_uri =~ m/^\Q$baseuri\E\/+(html|json|extjs|htmljs)(\/.*)?$/;
     $rel_uri = '/' if !$rel_uri;
  
     return wantarray ? ($rel_uri, $format) : $rel_uri;

Modified: pve-manager/pve2/www/css/ext-pve.css
===================================================================
--- pve-manager/pve2/www/css/ext-pve.css	2010-07-20 06:14:10 UTC (rev 4917)
+++ pve-manager/pve2/www/css/ext-pve.css	2010-07-20 12:23:55 UTC (rev 4918)
@@ -52,3 +52,38 @@
     border:0px;
     height:6px;
 }
+
+
+/*!
+ * Ext JS Library 3.2.1
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing at extjs.com
+ * http://www.extjs.com/license
+ */
+/*
+ * FileUploadField component styles
+ */
+.x-form-file-wrap {
+    position: relative;
+    height: 22px;
+}
+.x-form-file-wrap .x-form-file {
+	position: absolute;
+	right: 0;
+	-moz-opacity: 0;
+	filter:alpha(opacity: 0);
+	opacity: 0;
+	z-index: 2;
+    height: 22px;
+}
+.x-form-file-wrap .x-form-file-btn {
+	position: absolute;
+	right: 0;
+	z-index: 1;
+}
+.x-form-file-wrap .x-form-file-text {
+    position: absolute;
+    left: 0;
+    z-index: 3;
+    color: #777;
+}
\ No newline at end of file

Modified: pve-manager/pve2/www/manager/Makefile.am
===================================================================
--- pve-manager/pve2/www/manager/Makefile.am	2010-07-20 06:14:10 UTC (rev 4917)
+++ pve-manager/pve2/www/manager/Makefile.am	2010-07-20 12:23:55 UTC (rev 4918)
@@ -3,6 +3,7 @@
 JSSRC= 				                 	\
 	../ext/extjs/examples/ux/MultiSelect.js	 	\
 	../ext/extjs/examples/ux/BufferView.js 		\
+	../ext/extjs/examples/ux/fileuploadfield/FileUploadField.js \
 	PVEUtils.js 					\
 	util/base64.js					\
 	data/ObjectReader.js				\

Modified: pve-manager/pve2/www/manager/StorageBrowser.js
===================================================================
--- pve-manager/pve2/www/manager/StorageBrowser.js	2010-07-20 06:14:10 UTC (rev 4917)
+++ pve-manager/pve2/www/manager/StorageBrowser.js	2010-07-20 12:23:55 UTC (rev 4918)
@@ -27,7 +27,46 @@
 	Ext.apply(self, {
 	    stateful: false,
 	    store: store,
-	    //enableHdMenu: false,
+	    tbar: [
+		'->',
+		{
+		    xtype: 'form',
+		    url: '/api2/htmljs/storage/content/' + node + '/' + storeid,
+		    fileUpload: true,
+		    height: 22,
+		    border: false,
+		    baseCls: 'plain', 
+		    items: {
+			xtype: 'fileuploadfield',
+			name: 'upload',
+			buttonOnly: true,
+			buttonText: 'Upload',
+			listeners: {
+			    fileselected: function(field, v) {
+				self.el.mask('Please wait...', 'x-mask-loading');
+				var form = field.ownerCt.getForm();
+				//alert("selected " +  v);
+				form.submit({
+				    failure: function(f, resp){
+					self.el.unmask();
+					f.reset();
+					var msg = "Please try again";
+					if (resp.result && resp.result.message) {
+					    msg = resp.result.message;
+					} 
+					Ext.MessageBox.alert('Failure', "Upload failed. " + msg);
+				    },
+				    success: function(f, resp){
+					self.el.unmask();
+					f.reset();
+					Ext.MessageBox.alert('Failure', "Upload succesful");
+				    }
+				});
+			    }
+			}
+ 		    }
+		}
+	    ],	    
 	    colModel: new Ext.grid.ColumnModel({
 		columns: [
 		    {



More information about the pve-devel mailing list