]> git.p6c8.net - jirafeau.git/blobdiff - lib/functions.js
Bypass size limit by splitting big files on client’s side using HTML5 file API
[jirafeau.git] / lib / functions.js
index 15ae08c59b396bfc1fc9720ee5456eaf84abdaa1..aba302c29eebe206d7f8b884508c6ccc8d3c8464 100755 (executable)
@@ -32,13 +32,17 @@ function show_link (url, reference, delete_code, date)
     }
     else
         document.getElementById('validity').style.display = 'none';
-    
 
     document.getElementById('uploading').style.display = 'none';
     document.getElementById('upload').style.display = 'none';
     document.getElementById('upload_finished').style.display = '';
 }
 
+function show_upload_progression (p)
+{
+    document.getElementById('uploaded_percentage').innerHTML = p;
+}
+
 function upload_progress (e)
 {
     if (!e.lengthComputable)
@@ -47,7 +51,7 @@ function upload_progress (e)
      * to give a response before providing the link.
      */
     var p = Math.round (e.loaded * 99 / e.total);
-    document.getElementById('uploaded_percentage').innerHTML = p.toString() + '%';
+    show_upload_progression (p.toString() + '%');
 }
 
 function upload_failed (e)
@@ -56,12 +60,12 @@ function upload_failed (e)
     alert ('Sorry, upload failed');
 }
 
-function upload (url, file, time, password, one_time)
+function classic_upload (url, file, time, password, one_time)
 {
     var req = new XMLHttpRequest ();
-    req.upload.addEventListener("progress", upload_progress, false);
-    req.addEventListener("error", upload_failed, false);
-    req.addEventListener("abort", upload_failed, false);
+    req.upload.addEventListener ("progress", upload_progress, false);
+    req.addEventListener ("error", upload_failed, false);
+    req.addEventListener ("abort", upload_failed, false);
     req.onreadystatechange = function ()
     {
         if (req.readyState == 4 && req.status == 200)
@@ -83,6 +87,8 @@ function upload (url, file, time, password, one_time)
                     d.setSeconds (d.getSeconds() + 604800);
                 else if (time == 'month')
                     d.setSeconds (d.getSeconds() + 2419200);
+                else
+                    return;
                 show_link (url, res[0], res[1], d.toString());
             }
             else
@@ -102,12 +108,170 @@ function upload (url, file, time, password, one_time)
     req.send (form);
 }
 
-function start_upload (url)
+function check_html5_file_api ()
+{
+    if (window.File && window.FileReader && window.FileList && window.Blob)
+        return true;
+    return false;
+}
+
+var async_global_transfered = 0;
+var async_global_url = '';
+var async_global_file;
+var async_global_ref = '';
+var async_global_max_size = 0;
+var async_global_time;
+var async_global_transfering = 0;
+
+function async_upload_start (url, max_size, file, time, password, one_time)
 {
-    upload (url,
+    async_global_transfered = 0;
+    async_global_url = url;
+    async_global_file = file;
+    async_global_max_size = max_size;
+    async_global_time = time;
+
+    var req = new XMLHttpRequest ();
+    req.addEventListener ("error", upload_failed, false);
+    req.addEventListener ("abort", upload_failed, false);
+    req.onreadystatechange = function ()
+    {
+        if (req.readyState == 4 && req.status == 200)
+        {
+            var res = req.responseText;
+            if (res == "Error")
+                return;
+            res = res.split ("\n");
+            async_global_ref = res[0];
+            var code = res[1];
+            async_upload_push (code);
+        }
+    }
+    req.open ("POST", async_global_url + 'script.php?init_async' , true);
+
+    var form = new FormData();
+    form.append ("filename", async_global_file.name);
+    form.append ("type", async_global_file.type);
+    if (time)
+        form.append ("time", time);
+    if (password)
+        form.append ("key", password);
+    if (one_time)
+        form.append ("one_time_download", '1');
+    req.send (form);
+}
+
+function async_upload_progress (e)
+{
+    if (!e.lengthComputable && async_global_file.size != 0)
+        return;
+    var p = Math.round ((e.loaded + async_global_transfered) * 99 / (async_global_file.size));
+    show_upload_progression (p.toString() + '%');
+}
+
+function async_upload_push (code)
+{
+    if (async_global_transfered == async_global_file.size)
+    {
+        async_upload_end (code);
+        return;
+    }
+    var req = new XMLHttpRequest ();
+    req.upload.addEventListener ("progress", async_upload_progress, false);
+    req.addEventListener ("error", upload_failed, false);
+    req.addEventListener ("abort", upload_failed, false);
+    req.onreadystatechange = function ()
+    {
+        if (req.readyState == 4 && req.status == 200)
+        {
+            var res = req.responseText;
+            if (res == "Error")
+                return;
+            res = res.split ("\n");
+            var code = res[0]
+            async_global_transfered = async_global_transfering;
+            async_upload_push (code);
+        }
+    }
+    req.open ("POST", async_global_url + 'script.php?push_async' , true);
+
+    var chunk_size = parseInt (async_global_max_size * 0.90);
+    var start = async_global_transfered;
+    var end = start + chunk_size;
+    if (end >= async_global_file.size)
+        end = async_global_file.size;
+    var blob = async_global_file.slice (start, end);
+    async_global_transfering = end;
+
+    var form = new FormData();
+    form.append ("ref", async_global_ref);
+    form.append ("data", blob);
+    form.append ("code", code);
+    req.send (form);
+}
+
+function async_upload_end (code)
+{
+    var req = new XMLHttpRequest ();
+    req.addEventListener ("error", upload_failed, false);
+    req.addEventListener ("abort", upload_failed, false);
+    req.onreadystatechange = function ()
+    {
+        if (req.readyState == 4 && req.status == 200)
+        {
+            var res = req.responseText;
+            if (res == "Error")
+                return;
+            res = res.split ("\n");
+            if (async_global_time != 'none')
+            {
+                var d = new Date();
+                if (async_global_time == 'minute')
+                    d.setSeconds (d.getSeconds() + 60);
+                else if (async_global_time == 'hour')
+                    d.setSeconds (d.getSeconds() + 3600);
+                else if (async_global_time == 'day')
+                    d.setSeconds (d.getSeconds() + 86400);
+                else if (async_global_time == 'week')
+                    d.setSeconds (d.getSeconds() + 604800);
+                else if (async_global_time == 'month')
+                    d.setSeconds (d.getSeconds() + 2419200);
+                else
+                    return;
+                show_link (async_global_url, res[0], res[1], d.toString());
+            }
+            else
+                show_link (async_global_url, res[0], res[1]);
+        }
+    }
+    req.open ("POST", async_global_url + 'script.php?end_async' , true);
+
+    var form = new FormData();
+    form.append ("ref", async_global_ref);
+    form.append ("code", code);
+    req.send (form);
+}
+
+function upload (url, max_size)
+{
+    if (check_html5_file_api ()
+        && document.getElementById('file_select').files[0].size >= max_size)
+    {
+        async_upload_start (url,
+            max_size,
             document.getElementById('file_select').files[0],
             document.getElementById('select_time').value,
             document.getElementById('input_key').value,
             document.getElementById('one_time_download').checked
             );
-}
\ No newline at end of file
+    }
+    else
+    {
+        classic_upload (url,
+            document.getElementById('file_select').files[0],
+            document.getElementById('select_time').value,
+            document.getElementById('input_key').value,
+            document.getElementById('one_time_download').checked
+            );
+    }
+}

patrick-canterino.de