Commit 14d7aed
2013-12-16 09:27:34
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>