c# 在内存打包zip 多个文件 上传服务器 MemoryStream ZipArchiveMode
2021-01-09 04:29
                         标签:position   ica   help   console   dir   abs   enc   man   ror    代码功能包括:   1:  c# 在内存打包zip 多个文件 上传服务器 MemoryStream  ZipArchiveMode 标签:position   ica   help   console   dir   abs   enc   man   ror    原文地址:https://www.cnblogs.com/zknublx/p/13097771.htmlusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Utilities;
using System.Net.Http;
using System.Net;
using System.Net.Http.Headers;
using System.Drawing;
using System.IO.Compression;
namespace Expander
{
    public partial class OperationDataForm : Form
    {
        private string server = "http://localhost:5000";
        public const int step = 2;
 
        public OperationDataForm()
        {
            InitializeComponent();
        }
        private void FolderSelectBtn_Click(object sender, EventArgs e)
        {
       // 初始化 文件上传 按钮
            using (var fbd = new FolderBrowserDialog())
            {
                var result = fbd.ShowDialog();
                if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
                {
                    rootFolderTextBox.Text = fbd.SelectedPath;
                    this.UploadFileBtn.Enabled = false;
                    this.ProgressBarPanel.Visible = false;
                }
            }
        }
        private void CheckFileBtn_Click(object sender, EventArgs e)
        {
            //判断文件路径是否存在
            string filePath = this.rootFolderTextBox.Text;
            FolderExsitStatus folderExistStatus = FileSystemUtilities.IsFileExsit(filePath);
            if (folderExistStatus.ToString() != "FolderExsit")
            {
                MessageBox.Show("file path is not exist");
            }
            else {
                bool accessStatus = FileSystemUtilities.CheckAccessControl(filePath);
                if (!accessStatus)
                {
                    MessageBox.Show("file path not access.");
                }
                else
                {
                    InitLabelData();
                    // reset value
                    this.CheckResultDataSet.Items.Clear();
                    this.CheckResultDataSet.Refresh();
                    UploadFileBtn.Enabled = false;
                    UploadFileBtn.Refresh();
            // 创建文件路径
                    string[] folderFilePathList = Directory.GetDirectories(filePath);
                    this.CheckResultDataSet.BeginUpdate();
                    int successCount = 0;
                    int failCount = 0;
                    this.CountLabel.Text = "Count: " + folderFilePathList.Length.ToString();
                    this.CountLabel.Refresh();
                    foreach (string folderFilePath in folderFilePathList)
                    {
                        var checkRes = ValidatorUtilities.ValidateDataFolder(folderFilePath);
                        ListViewItem lvi = new ListViewItem();
                        string resMessage = "";
                        string resStatus = "";
                        if (checkRes.Item2 == null)
                        {
                            resMessage = "OK";
                            resStatus = "Success";
                            lvi.ImageIndex = 1;
                            successCount++;
                            this.SuccessLabel.Text = "Success: " + successCount.ToString();
                            this.SuccessLabel.Refresh();
                        }
                        else
                        {
                            resMessage = checkRes.Item2.ToString();
                            resStatus = "Fail";
                            lvi.ImageIndex = 0;
                            failCount++;
                            this.FailLabel.Text = "Fail: " + failCount.ToString();
                            this.FailLabel.Refresh();
                        }
                        lvi.SubItems.Add(resStatus);
                        lvi.SubItems.Add(folderFilePath.Split(‘\\‘)[folderFilePath.Split(‘\\‘).Length - 1]);
                        lvi.SubItems.Add(resMessage);
                        lvi.SubItems.Add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                        this.CheckResultDataSet.Items.Add(lvi);
                    }
                    this.CheckResultDataSet.EndUpdate();
                    this.CheckResultDataSet.Sort();
                    this.CheckResultDataSet.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
                    // update load 
                    if (folderFilePathList.Length == successCount)
                    {
                        UploadFileBtn.Enabled = true;
                    }
                }
            }
        }
       
       
        public void AutoSizeForm() {
            int width = this.Width;
            int height = this.Height;
            int splitterDistance = this.splitContainer1.SplitterDistance;
            
            int rightPanelHeight = this.splitContainer1.Panel2.Height;
            int rightPanelWidth = width - splitterDistance;
            this.CheckResultDataSet.Height = int.Parse((rightPanelHeight * 0.815).ToString().Split(‘.‘)[0]);
            this.CheckResultDataSet.Width = int.Parse((rightPanelWidth * 0.94).ToString().Split(‘.‘)[0]);
            this.ProgressBarPanel.Width = int.Parse((rightPanelWidth * 0.70).ToString().Split(‘.‘)[0]);
            this.myProgressBar2.Width = int.Parse((rightPanelWidth * 0.68).ToString().Split(‘.‘)[0]);
            this.CheckResultDataSet.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        }
        private void OperationDataForm_Load(object sender, EventArgs e)
        {  
            this.UploadFileBtn.Enabled = false;
            // init listview
            this.CheckResultDataSet.Columns.Add("", 45, HorizontalAlignment.Left);
            this.CheckResultDataSet.Columns.Add("Status", 80, HorizontalAlignment.Left);
            this.CheckResultDataSet.Columns.Add("Person Folder Name", 240, HorizontalAlignment.Left);
            this.CheckResultDataSet.Columns.Add("Message", 280, HorizontalAlignment.Left);
            this.CheckResultDataSet.Columns.Add("Update Time", 150, HorizontalAlignment.Left);
            InitLabelData();
            AutoSizeForm();
            this.CheckResultDataSet.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        }
        private void UploadFileBtn_Click(object sender, EventArgs e)
        {
            string sourceFilePath = this.rootFolderTextBox.Text;
            // personId dir
            string[] PersonFilesArray = Directory.GetFileSystemEntries(sourceFilePath);
            this.ProgressBarPanel.Visible = true;
            this.ProgressBarInfo.Text = "Data uploading ..";
            
            // load progressBar
            this.myProgressBar2.Maximum = PersonFilesArray.Count();
            this.myProgressBar2.Minimum = 0;
            this.myProgressBar2.Value = 0;
            this.ProgressBarInfo.Refresh();
            this.CloseProgressBarPictureBox.Refresh();
            this.ProgressBarPanel.Refresh();
            // get taskId
            string taskId = GetTaskId();
            // pack in memory and send
            int personNumIndex = 0;
            int arrSize = PersonFilesArray.Count() % step == 0 ? PersonFilesArray.Count() / step : PersonFilesArray.Count() / step + 1;
            int progressSep = int.Parse((100 / arrSize).ToString().Split(‘.‘)[0]);
            while (personNumIndex * step  PersonFilesArray.Count())
            {
                Liststring> sub = PersonFilesArray.Skip(personNumIndex * step).Take(step).ToList();
                // generate zipData in memory
                byte[] memoryZipData = PackedFileZip(sub);
                // send http server
                var res = HttpClientPostUpload(memoryZipData, taskId, "result.zip");
                if (res.Item1 == 0)
                {
                    // upload success
                    Console.WriteLine("taskId={0},updalod success and personIds={1} ", taskId, res.Item2);
                }
                else
                {
                    // upload fail
                    Console.WriteLine(string.Format("taskId={0}, updalod fail and errorMessage={1}", taskId, res.Item2));
                }
                
                if (Math.Abs(personNumIndex * step - this.myProgressBar2.Maximum)  step)
                {
                    this.myProgressBar2.Value = this.myProgressBar2.Maximum;
                }
                else
                {
                    this.myProgressBar2.Value = personNumIndex * step + step;
                }
                personNumIndex++;
                
                this.myProgressBar2.Refresh();
            }
            string accomplishUrl = server + "/accomplish?taskId=" + taskId;
            HttpWebResponse response = HttpHelper(accomplishUrl);
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Console.WriteLine("taskId={0} success and transmission end");
            }
            else
            {
                Console.WriteLine(string.Format("taskId={0} fail and statuCode is {1}", taskId, response.StatusDescription));
            }
            // show close button
            this.CloseProgressBarPictureBox.Visible = true;
        }
        private void ListViewColumnClick(object sender, ColumnClickEventArgs e)
        {
            this.CheckResultDataSet.ListViewItemSorter = new ListViewItemComparer();
            // Call the sort method to manually sort.
            this.CheckResultDataSet.Sort();
        }
        private void ListViewMouseDoubleClick(object sender, MouseEventArgs e)
        {
            ListView listview = (ListView)sender;
            ListViewItem lstrow = listview.GetItemAt(e.X, e.Y);
            ListViewItem.ListViewSubItem lstcol = lstrow.GetSubItemAt(e.X, e.Y);
            string strText = lstcol.Text;
            try
            {
                Clipboard.SetDataObject(strText);
                MessageBox.Show("Copy successfully.", "提示", MessageBoxButtons.OK);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public void InitLabelData()
        {
            // init label
            this.CountLabel.Text = "Count: 0 ";
            this.SuccessLabel.Text = "Success: 0";
            this.FailLabel.Text = "Fail: 0";
            this.CountLabel.Refresh();
            this.SuccessLabel.Refresh();
            this.FailLabel.Refresh();
        }
        private void FormSizeChanged(object sender, EventArgs e)
        {
            AutoSizeForm();
        }
        public string GetTaskId() {
            var urlstring = server + "/assign";
            HttpWebResponse response2 = HttpHelper(urlstring);
            if (response2.StatusCode == HttpStatusCode.OK) {
                StreamReader sr2 = new StreamReader(response2.GetResponseStream(), Encoding.UTF8);
                string result = sr2.ReadToEnd();
                return result;
            }
            else {
                return "test";
            }
        }
        public HttpWebResponse HttpHelper(string url, string method = "POST")
        {
            // string param = (obj);参数
            byte[] bs = Encoding.Default.GetBytes("");
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
            req.Method = method;
            req.ContentType = "application/json";
            req.ContentLength = bs.Length;
            using (Stream reqStream = req.GetRequestStream())
            {
                reqStream.Write(bs, 0, bs.Length);
                reqStream.Close();
                HttpWebResponse response2 = (HttpWebResponse)req.GetResponse();
                return response2;
            }
        }
        public (int, string) HttpClientPostUpload(byte[] bmpBytes, string taskId,  string fileName)
        {
            using (var client = new HttpClient())
            {
                List> act = (dataContents) =>
                    {//声明一个委托,该委托的作用就是将ByteArrayContent集合加入到MultipartFormDataContent中
                        foreach (var byteArrayContent in dataContents)
                        {
                            content.Add(byteArrayContent);
                        }
                    };
                    act(list);//执行act
                    try
                    {
                        var result = client.PostAsync(server+"/submit", content).Result;//post请求
                        return (0, result.Content.ReadAsStringAsync().Result);
                    }
                    catch (Exception ex)
                    {
                        return (1, ex.Message);
                    }
                }
            }
        }
        public byte[] FileStreamToByte(string filePath) {
            string path = filePath;
            FileStream fs = new FileStream(path, FileMode.Open);
            //获取文件大小
            long size = fs.Length;
            byte[] array = new byte[size];
            //将文件读到byte数组中
            fs.Read(array, 0, array.Length);
            fs.Close();
            return array;
        }
        public byte[] StreamToBytes(Stream stream)
        {
            byte[] bytes = new byte[stream.Length];
            stream.Read(bytes, 0, bytes.Length);
            // 设置当前流的位置为流的开始
            stream.Seek(0, SeekOrigin.Begin);
            return bytes;
        }
        public byte[] PackedFileZip(Liststring> personPaths)
        {
            using (Stream memoryStream = new MemoryStream())
            {
                using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
                {
                    foreach (string path in personPaths)
                    {
                        string personId = Path.GetFileName(path);
                        foreach (string file in Directory.EnumerateFiles(path))
                        {
                            ZipArchiveEntry entry = archive.CreateEntry($"{personId}/{Path.GetFileName(file)}");
                            using (Stream entryStream = entry.Open())
                            using (Stream fileStream = File.OpenRead(file))
                            {
                                fileStream.CopyTo(entryStream);
                            }
                        }
                    }
                }
                memoryStream.Seek(0, SeekOrigin.Begin);
                return StreamToBytes(memoryStream);
            }
        }
        private List
string>> GroupListBySize(string[] list, int size)
        {
            List
string>> listArr = new List
string>>();
            int arrSize = list.Count() % size == 0 ? list.Count() / size : list.Count() / size + 1;
            for (int i = 0; i )
            {
                Liststring> sub = new Liststring>();
                for (int j = i * size; j 1) - 1; j++)
                {
                    if (j 1)
                    {
                        sub.Add(list[j]);
                    }
                }
                listArr.Add(sub);
            }
            return listArr;
        }
        private void CloseProgressBar_Click(object sender, EventArgs e)
        {
            this.ProgressBarPanel.Visible = false;
            this.CloseProgressBarPictureBox.Visible = false;
            this.myProgressBar2.Value = 0;
            this.myProgressBar2.Refresh();
            this.CloseProgressBarPictureBox.Refresh();
        }
        private void CloseProgressBarPictureBox_MouseHover(object sender, EventArgs e)
        {
            this.CloseProgressBarPictureBox.Cursor = Cursors.Hand;
        }
        private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
        {
            int formWidth = this.Width;
            int rightPanelWidth = formWidth - this.splitContainer1.SplitterDistance;
            this.CheckResultDataSet.Width = int.Parse((rightPanelWidth * 0.94).ToString().Split(‘.‘)[0]);
            this.ProgressBarPanel.Width = int.Parse((rightPanelWidth * 0.70).ToString().Split(‘.‘)[0]);
            this.myProgressBar2.Width = int.Parse((rightPanelWidth * 0.68).ToString().Split(‘.‘)[0]);
        }
        private void CheckInfoPanel_Paint(object sender, PaintEventArgs e)
        {
            //Panel pan = (Panel)sender;
            //float width = (float)0.5;
            //Pen pen = new Pen(SystemColors.ControlDark, width);
            //pen.DashStyle = DashStyle.Solid;
            //e.Graphics.DrawLine(pen, 0, 0, 0, pan.Height - 0);
            //e.Graphics.DrawLine(pen, 0, 0, pan.Width - 0, 0);
            //e.Graphics.DrawLine(pen, pan.Width - 1, pan.Height - 1, 0, pan.Height - 1);
            //e.Graphics.DrawLine(pen, pan.Width - 1, pan.Height - 1, pan.Width - 1, 0);
        }
       
        
    }
    public class ListViewItemComparer : System.Collections.IComparer
    {
        private int col=1;
        public int Compare(object x, object y)
        {
            int returnVal = -1;
            returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text,
            ((System.Windows.Forms.ListViewItem)y).SubItems[col].Text);
            return returnVal;
        }
    }
    public class MyProgressBar : ProgressBar
    {
        //public int Value = 0;
        public MyProgressBar()
        {
            SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
            //Value = 1;
            
        }
        public new int Value { get; set; }
        protected override void OnPaint(PaintEventArgs e)
        {
            //base.OnPaint(e);
            Rectangle rect = ClientRectangle;
            Graphics g = e.Graphics;
            ProgressBarRenderer.DrawHorizontalBar(g, rect);
            rect.Inflate(-3, -3);
            if (Value > 0)
            {
                var clip = new Rectangle(rect.X, rect.Y, (int)((float)(this.Value) / Maximum * rect.Width), rect.Height);
                ProgressBarRenderer.DrawHorizontalChunks(g, clip);
            }
            string text = string.Format("{0}/{1}", Value , Maximum); 
            using (var font = new Font(FontFamily.GenericSerif, 18))
            {
                SizeF sz = g.MeasureString(text, font);
                var location = new PointF(rect.Width / 2 - sz.Width / 2, rect.Height / 2 - sz.Height / 2 + 5);
                g.DrawString(text, font, Brushes.Black, location);
            }
           
        }
    }
}
文章标题:c# 在内存打包zip 多个文件 上传服务器 MemoryStream ZipArchiveMode
文章链接:http://soscw.com/essay/41087.html