Commit 14d7aed

bryfry <bryon.fryer@gmail.com>
2013-12-16 09:27:34
first
Changed files (5)
static/images/favicon.ico
Binary file
static/ffu.css
@@ -0,0 +1,6 @@
+body {
+  padding-top: 60px;
+}
+#upload_text {
+  margin-bottom: 0px;
+}
uploads/.gitignore
@@ -0,0 +1,1 @@
+*.tar.gz
ffu.py
@@ -0,0 +1,43 @@
+import tornado.ioloop
+import tornado.web
+import logging
+import tarfile
+import uuid
+from StringIO import StringIO
+import os
+
+class UploadHandler(tornado.web.RequestHandler):
+  
+#  def _handle_request_exception(self, e):
+#    logging.error('error',e)
+  
+  def get(self):
+    self.render("index.html")
+  
+  def post(self):
+    form_name = 'fileselect'
+    upload_dir = 'uploads/'
+    if self.request.files:
+      
+      tar = tarfile.open(upload_dir + str(uuid.uuid4()) + ".tar.gz", "w:gz")
+      fileinfo = self.request.files.itervalues()
+      for f in fileinfo:
+        #print f[0]['filename'], f[0]['content_type'], len(f[0]['body'])
+        f_info = tarfile.TarInfo(name=f[0]['filename'])
+        f_info.size = len(f[0]['body'])
+        tar.addfile(f_info, StringIO(f[0]['body']))
+      tar.close()
+    #self.render("index.html")
+
+  settings = {
+    "static_path": os.path.join(os.path.dirname(__file__),"static"),
+}
+
+application = tornado.web.Application([
+  (r"/", UploadHandler),
+  ], debug=True, static_path=os.path.join(os.path.dirname(__file__),'static'))
+
+if __name__ == "__main__":
+  application.listen(8888)
+  tornado.ioloop.IOLoop.instance().start()
+
index.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="description" content="">
+  <meta name="author" content="">
+  <link rel="shortcut icon" href="{{ static_url("images/favicon.ico")}}">
+  <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
+  <link rel="stylesheet" href="{{ static_url("ffu.css") }}">
+</head>
+
+<body>
+  <div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
+    <div class="container">
+      <div class="navbar-header">
+        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
+          <span class="sr-only">Toggle navigation</span>
+          <span class="icon-bar"></span>
+          <span class="icon-bar"></span>
+          <span class="icon-bar"></span>
+        </button>
+        <a class="navbar-brand" href="#">FFU</a>
+      </div>
+      <div class="collapse navbar-collapse">
+        <ul class="nav navbar-nav">
+          <li class="active"><a href="#">Home</a></li>
+          <li><a href="#about">Admin</a></li>
+        </ul>
+      </div><!--/.nav-collapse -->
+    </div>
+  </div>
+
+  <div class="container">
+    <form id="upload" enctype="multipart/form-data" action="" method="post">
+      <input type="file" id="fileselect" name="fileselect" multiple="multiple" style="display:none"/>
+      <div id="upload_zone" class="well upload_zone">
+        <p id="upload_text" class="lead text-center text-muted">Drop files or Click here</p>
+      </div>
+      <ul id="filelist" class="list-group"></ul>
+      <button type="submit">Upload</button>
+    </form>
+  </div><!-- /.container -->
+  <script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
+  <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
+  <script>
+    if (window.File && window.FileList) {
+      var form = $("#upload");
+      form.upload_zone = $("#upload_zone");
+      form.input_file = $("#fileselect"); 
+      form.file_list = $("#filelist"); 
+      form.upload_zone.files = new Array();
+      form.submit (function (e) {
+        e.preventDefault();
+        
+        // generate formdata to upload
+        var file_data = new FormData(form);
+        for (var i=0, file; file=form.upload_zone.files[i]; i++){
+          file_data.append("fileselect" + i.toString(), file);
+        }
+        
+        // send formdata to server
+        var request = new XMLHttpRequest();
+        request.open ($(this).attr("method"), $(this).attr("action"), true);
+        request.onload = function(oEvent) {
+          if (request.status == 200) {
+            form.upload_zone.innerHTML = "Uploaded!";
+          } else {
+            form.upload_zone.innerHTML = "Error " + request.status + " occurred uploading your file.<br \/>";
+          }
+        };       
+        request.send(file_data);
+      }); 
+
+      // manage meta-file array
+      var handleFiles = function (files) {
+        for (var i=0, file; file=files[i]; i++){
+          form.upload_zone.files.push (file);
+          form.file_list.append ("<li class='list-group-item'>"+file.name+"</li>");
+        }
+      } // end handleFiles
+
+      // watch for changes in form-input-file element
+      form.input_file.change (function (event) { 
+        handleFiles (form.input_file[0].files); // jquery get to FileList at [0]
+      });
+      
+      // open input-file-multiple dialogue
+      form.upload_zone.click (function (event) {
+        form.input_file.focus();
+        form.input_file.click();
+      });
+
+      // TODO add clear button
+      // TODO move upload up with upload_zone
+      // TODO add X button area on list elements to remove each
+      // TODO (python) send success message 
+      // TODO file name collisions deduplication
+    
+    } // end upload jquery functions
+    
+    $(document).on ('dragstart dragenter dragover', function (e) {
+      if ($.inArray('Files', e.originalEvent.dataTransfer.types) > -1) {
+        e.stopPropagation();
+        e.preventDefault();
+        $('#upload_zone').css('border', '2px dashed #0B85A1');
+      }
+    });
+    
+    $(document).on ('dragleave dragged', function (e) {
+        e.stopPropagation();
+        e.preventDefault();
+        $('#upload_zone').css('border', '');
+    });
+
+     $(document).on ('drop', function (e) {
+        e.stopPropagation();
+        e.preventDefault();
+        $('#upload_zone').css('border', '');
+        if (e.target.id =='upload_zone' || $(e.target).parent().is('#upload_zone')){
+          handleFiles(e.originalEvent.dataTransfer.files);
+        }
+    });
+
+
+
+  </script>
+</body>