From: joinsang Date: Tue, 12 Mar 2019 09:59:12 +0000 (+0900) Subject: 압축 progress 작업중 X-Git-Url: https://git.insang.kr/gitweb/?a=commitdiff_plain;h=190d2b3b06a6a0d1aaa2df46974383c3663648bb;p=ZipProject.git 압축 progress 작업중 --- diff --git a/ZipProject/Controllers/WebZipController.cs b/ZipProject/Controllers/WebZipController.cs index 3303c29..cb449fd 100644 --- a/ZipProject/Controllers/WebZipController.cs +++ b/ZipProject/Controllers/WebZipController.cs @@ -1,4 +1,7 @@ -using System.Threading; +using System.Net.Http; +using System.IO; +using System.ComponentModel; +using System.Threading; using System.Diagnostics; using System; using System.Collections.Generic; @@ -45,13 +48,24 @@ namespace ZipProject.Controllers { //파일업로드 사이즈 3GB (3(GB) * 1024(MB) * 1024(KB) * 1024(byte)) [RequestSizeLimit(3221225472)] public ActionResult FileUpload(string dirList, List files, string fileKeyPair, string format){ + string userId= Request.HttpContext.Connection.Id; JObject keyPair_FileDir= JObject.Parse(fileKeyPair); + Dictionary data= new Dictionary(); ZipModel zipModel= new ZipModel(); + ZipLists.AddZipList(userId, zipModel); + string[] listDir= dirList.Split(','); - var zip= zipModel.MakeZip(keyPair_FileDir, listDir, files); string filename= listDir[0]+"."+format; + + zipModel.MakeZip(keyPair_FileDir, listDir, files, userId); + + // return File(zip.ToArray(), "application/zip"); + return Json(Thread.CurrentThread.ManagedThreadId); + } - return File(zip.ToArray(), "application/zip"); + public ActionResult FileUploadProgress(){ + string userId= Request.HttpContext.Connection.Id; + return Json(ZipLists.GetZipList(userId).getNow()); } public ActionResult Error(){ diff --git a/ZipProject/Models/ZipLists.cs b/ZipProject/Models/ZipLists.cs new file mode 100644 index 0000000..0fa85ed --- /dev/null +++ b/ZipProject/Models/ZipLists.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace ZipProject.Models { + public static class ZipLists { + private static Dictionary ZipModel= new Dictionary(); + + public static ZipModel GetZipList(string userId){ + return ZipModel["userId"]; + } + + public static void AddZipList(string userId, ZipModel zip){ + ZipModel.Add(userId, zip); + } + + } +} \ No newline at end of file diff --git a/ZipProject/Models/ZipModel.cs b/ZipProject/Models/ZipModel.cs index a543a48..1b7a649 100644 --- a/ZipProject/Models/ZipModel.cs +++ b/ZipProject/Models/ZipModel.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.ComponentModel; using System.IO; using System.Linq; using System.Security.AccessControl; @@ -12,18 +13,22 @@ using Newtonsoft.Json.Linq; namespace ZipProject { public class ZipModel { private readonly string[] _FOTMAT = { "zip", "7z", "rar" }; + private int now; public ZipModel () { } - public MemoryStream MakeZip (JObject keypair, string[] dirList, List files) { - MemoryStream memoryStream = new MemoryStream (); + public void MakeZip (JObject keypair, string[] dirList, List files, string zipname) { + byte[] b = null; + string filename = null; + string dir = null; + string path = Environment.CurrentDirectory + "/wwwroot/zipfiles/" + zipname + ".zip"; using (var zip = new ZipFile (Encoding.UTF8)) { - byte[] b = null; - string filename = null; - string dir = null; - foreach (IFormFile file in files) { + zip.AddProgress += AddProgressHandler; + zip.CompressionLevel = Ionic.Zlib.CompressionLevel.Default; + zip.SaveProgress += SaveProgress; + //keypair 디렉토리 키값이 0(압축파일 최상단에 놓여야할 파일)일경우 "" 아닐경우 디렉토리명/파일 식으로 세팅 dir = ((string) keypair[file.FileName] == "0") ? "" : dirList[Int32.Parse ((string) keypair[file.FileName])] + "/"; //시스템의 기본 인코딩 타입으로 읽어서 @@ -34,13 +39,42 @@ namespace ZipProject { //파일을 zip엔트리에 추가 zip.AddEntry (dir + filename, file.OpenReadStream ()); } + zip.Save (path); + } + } + + int _numEntriesAdded = 0; + void AddProgressHandler (object sender, AddProgressEventArgs e) { + switch (e.EventType) { + case ZipProgressEventType.Adding_Started: + _numEntriesAdded = 0; + break; + case ZipProgressEventType.Adding_AfterAddEntry: + _numEntriesAdded++; + break; + case ZipProgressEventType.Adding_Completed: + Console.WriteLine("end"); + now= -1; + break; + } + } - //메모리스트림에 저장 - zip.Save (memoryStream); + public void SaveProgress (object sender, SaveProgressEventArgs e) { + if (e.EventType == ZipProgressEventType.Saving_Started) { + Console.WriteLine ("Begin Saving: " + e.ArchiveName); + } else if (e.EventType == ZipProgressEventType.Saving_BeforeWriteEntry) { + Console.WriteLine ("Processing : " + e.CurrentEntry.FileName); + Console.WriteLine ("Files Processed: (" + (e.EntriesSaved + 1) + "/" + e.EntriesTotal + ")"); + now= e.EntriesSaved +1; + } else if (e.EventType == ZipProgressEventType.Saving_EntryBytesRead) { + //개별파일의 진행률.. 안씀 } - //zip파일 return - return memoryStream; + } + + public int getNow(){ + return now; } } + } \ No newline at end of file diff --git a/ZipProject/Startup.cs b/ZipProject/Startup.cs index f54ec5b..231c935 100644 --- a/ZipProject/Startup.cs +++ b/ZipProject/Startup.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.WebSockets; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -50,6 +52,7 @@ namespace ZipProject { name: "default", template: "{controller=WebZip}/{action=Index}/{id?}"); }); + } } } \ No newline at end of file diff --git a/ZipProject/wwwroot/js/Zip/partial_zip.js b/ZipProject/wwwroot/js/Zip/partial_zip.js index 078bf9e..05f875c 100644 --- a/ZipProject/wwwroot/js/Zip/partial_zip.js +++ b/ZipProject/wwwroot/js/Zip/partial_zip.js @@ -342,17 +342,28 @@ function RequestCompress() { data: formdata, processData: false, contentType: false, - xhrFields: { - responseType: "blob" - }, + // xhrFields: { + // responseType: "blob" + // }, success: function(data) { - var a = document.createElement("a"); - var url = window.URL.createObjectURL(data); - a.href = url; - a.download = directories.get(0) + "." + format; - a.click(); - window.URL.revokeObjectURL(url); + // var a = document.createElement("a"); + // var url = window.URL.createObjectURL(data); + // a.href = url; + // a.download = directories.get(0) + "." + format; + // a.click(); + // window.URL.revokeObjectURL(url); + var now; + while(now != -1){ + $.ajax({ + type: "post", + url: "/webzip/fileuploadprogress", + }).done(function(data){ + now= data; + console.log(data); + }) + } $(".modal").css("display", "none"); + var socket = new WebSocket(); } }); } @@ -370,13 +381,11 @@ function ChangeInput($elem) { } if (isErrFileName($elem.val())) { alert(_Language["err_violationFileName"]); - $elem.val("dir "+ (++sameDir)); - } - else if (isTooLongFileName($elem.val())) { + $elem.val("dir " + ++sameDir); + } else if (isTooLongFileName($elem.val())) { alert(_Language["err_tooLongFileName"]); - $elem.val("dir "+ (++sameDir)); - } - else { + $elem.val("dir " + ++sameDir); + } else { directories.put($elem.prev().attr("key"), $elem.val()); } $elem.prev().text($elem.val()); @@ -451,3 +460,19 @@ document.getElementById("zipExplore").addEventListener("contextmenu", event => { SetBulletIcon(); SetSortable(); directories.put(0, "example"); + +// var protocol = location.protocol === "https:" ? "wss:" : "ws:"; +// var wsUri = protocol + "//" + window.location.host + "/ws"; +// var socket = new WebSocket(wsUri); +// socket.onopen = e => { +// console.log("socket opened", e); +// }; +// socket.onclose = function(e) { +// console.log("socket closed", e); +// }; +// socket.onmessage = function(e) { +// console.log(e); +// }; +// socket.onerror = function(e) { +// console.error(e.data); +// }; diff --git a/ZipProject/wwwroot/zipfiles/0HLL6PMBMT2JN.zip b/ZipProject/wwwroot/zipfiles/0HLL6PMBMT2JN.zip new file mode 100644 index 0000000..3c2a269 Binary files /dev/null and b/ZipProject/wwwroot/zipfiles/0HLL6PMBMT2JN.zip differ diff --git a/ZipProject/wwwroot/zipfiles/example2.zip b/ZipProject/wwwroot/zipfiles/example2.zip new file mode 100644 index 0000000..aaf0d05 Binary files /dev/null and b/ZipProject/wwwroot/zipfiles/example2.zip differ diff --git a/ZipProject/wwwroot/zipfiles/name.zip b/ZipProject/wwwroot/zipfiles/name.zip new file mode 100644 index 0000000..585e0c7 Binary files /dev/null and b/ZipProject/wwwroot/zipfiles/name.zip differ