winform程序压缩文件上传,服务器端asp.net mvc进行接收解压

期间编程没什么难度,唯一可能忽略导致结果失败是asp.net  mvc配置

对于压缩文件大的话,需要配置mvc的最大接收量:

  <system.web>
    <httpRuntime maxRequestLength="2147483647" executionTimeout="3600" />    <!--允许上传数据大小->
  </system.web>

 <system.webServer>
    <!--允许上传文件长度,单位字节-->
    <security>
       <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483647"/>
      </requestFiltering>
    </security>
 </system.webServer>

  

winform中压缩和上传:

调用部分如下:

string proPath = Application.StartupPath + "\\temp\\product\\" + project.ProjectName;
ZipFile(proPath,proPath + ".zip");//压缩

var uploadResult = Upload_Request(WebConfig.UploadUrl + "/Mobile/ReceiveProjectFile", proPath + ".zip",
project.ProjectName + ".zip");//上传
if (uploadResult == 0)
{
LoadingForm.CloseLoadingCircle();
Notification t = new Notification("方案附件上传失败,请重试!", 3, FormAnimator.AnimationMethod.Slide, FormAnimator.AnimationDirection.Up, true, "error");
t.Show();
return;
}
File.Delete(proPath + ".zip");

 

/// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="strFile">待压缩文件路径</param>
        /// <param name="strZip">压缩文件路径</param>
        public void ZipFile(string strFile, string strZip)
        {
            if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
                strFile += Path.DirectorySeparatorChar;
            ZipOutputStream s = new ZipOutputStream(File.Create(strZip));
            s.SetLevel(6); // 0 - store only to 9 - means best compression
            zip(strFile, s, strFile);
            s.Finish();
            s.Close();
        }

        private void zip(string strFile, ZipOutputStream s, string staticFile)
        {
            if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar;
            Crc32 crc = new Crc32();
            string[] filenames = Directory.GetFileSystemEntries(strFile);
            foreach (string file in filenames)
            {

                if (Directory.Exists(file))
                {
                    zip(file, s, staticFile);
                }

                else // 否则直接压缩文件
                {
                    //打开压缩文件
                    FileStream fs = File.OpenRead(file);

                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    string tempfile = file.Substring(staticFile.LastIndexOf("\\") + 1);
                    ZipEntry entry = new ZipEntry(tempfile);

                    entry.DateTime = DateTime.Now;
                    entry.Size = fs.Length;
                    fs.Close();
                    crc.Reset();
                    crc.Update(buffer);
                    entry.Crc = crc.Value;
                    s.PutNextEntry(entry);

                    s.Write(buffer, 0, buffer.Length);
                }
            }
        }

  

/// <summary>
        /// 将本地文件上传到指定的服务器(HttpWebRequest方法)
        /// </summary>
        /// <param name="address">文件上传到的服务器</param>
        /// <param name="fileNamePath">要上传的本地文件(全路径)</param>
        /// <param name="saveName">文件上传后的名称</param>
        /// <returns>成功返回1,失败返回0</returns>
        private int Upload_Request(string address, string fileNamePath, string saveName)
        {
            int returnValue = 0;
            // 要上传的文件
            FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
            BinaryReader r = new BinaryReader(fs);
            //时间戳
            string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
            byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");
            //请求头部信息
            StringBuilder sb = new StringBuilder();
            sb.Append("--");
            sb.Append(strBoundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=‘");
            sb.Append("file");
            sb.Append("‘; filename=");
            sb.Append(saveName);
            sb.Append("‘");
            sb.Append("\r\n");
            sb.Append("Content-Type: ");
            sb.Append("application/octet-stream");
            sb.Append("\r\n");
            sb.Append("\r\n");
            string strPostHeader = sb.ToString();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);
            // 根据uri创建HttpWebRequest对象
            HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(address);
            httpReq.Method = "POST";
            //对发送的数据不使用缓存
            httpReq.AllowWriteStreamBuffering = false;
            //设置获得响应的超时时间(300秒)
            httpReq.Timeout = 300000;
            httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
            long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
            long fileLength = fs.Length;
            httpReq.ContentLength = length;
            try
            {
                //每次上传4k
                int bufferLength = 4096;
                byte[] buffer = new byte[bufferLength];
                //已上传的字节数
                long offset = 0;
                //开始上传时间
                DateTime startTime = DateTime.Now;
                int size = r.Read(buffer, 0, bufferLength);
                Stream postStream = httpReq.GetRequestStream();
                //发送请求头部消息
                postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                while (size > 0)
                {
                    postStream.Write(buffer, 0, size);
                    offset += size;
                    Application.DoEvents();
                    size = r.Read(buffer, 0, bufferLength);
                }
                //添加尾部的时间戳
                postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                postStream.Close();
                //获取服务器端的响应
                WebResponse webRespon = httpReq.GetResponse();
                Stream s = webRespon.GetResponseStream();
                StreamReader sr = new StreamReader(s);
                //读取服务器端返回的消息
                String sReturnString = sr.ReadLine();
                s.Close();
                sr.Close();
                if (sReturnString == "Success")
                {
                    returnValue = 1;
                }
                else if (sReturnString == "Error")
                {
                    returnValue = 0;
                }
            }
            catch
            {
                returnValue = 0;
            }
            finally
            {
                fs.Close();
                r.Close();
            }
            return returnValue;
        }

  

asp.net mvc接收压缩包,并解压:

/// <summary>
        /// 接收文件压缩包
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ContentResult ReceiveProjectFile()
        {

            var result = "Success";
            try
            {
                if (Request.Files.Count < 1)
                {
                    result = "Error";
                    return Content(result);;
                }
                HttpPostedFileBase file = Request.Files[0];
                string filePath = Server.MapPath("~/SERVER") + "/" + file.FileName;
                file.SaveAs(filePath);
                unZipFile(filePath, Server.MapPath("~/SERVER") + "/" + file.FileName.Substring(0,file.FileName.IndexOf(".zip")));
            }
            catch (Exception)
            {
                result = "Error";
            }

            return Content(result);
        }

  

 /// <summary>
        ///
        /// </summary>
        /// <param name="TargetFile">待解压文件</param>
        /// <param name="fileDir">解压路径</param>
        /// <returns></returns>
        public string unZipFile(string TargetFile, string fileDir)
        {
            string rootFile = " ";
            try
            {
                //读取压缩文件(zip文件),准备解压缩
                ZipInputStream s = new ZipInputStream(System.IO.File.OpenRead(TargetFile.Trim()));
                ZipEntry theEntry;
                string path = fileDir;
                //解压出来的文件保存的路径

                string rootDir = " ";
                //根目录下的第一个子文件夹的名称
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    rootDir = Path.GetDirectoryName(theEntry.Name);
                    //得到根目录下的第一级子文件夹的名称
                    if (rootDir.IndexOf("\\") >= 0)
                    {
                        rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
                    }
                    string dir = Path.GetDirectoryName(theEntry.Name);
                    //根目录下的第一级子文件夹的下的文件夹的名称
                    string fileName = Path.GetFileName(theEntry.Name);
                    //根目录下的文件名称
                    if (dir != " ")
                    //创建根目录下的子文件夹,不限制级别
                    {
                        if (!Directory.Exists(fileDir + "\\" + dir))
                        {
                            path = fileDir + "\\" + dir;
                            //在指定的路径创建文件夹
                            Directory.CreateDirectory(path);
                        }
                    }
                    else if (dir == " " && fileName != "")
                    //根目录下的文件
                    {
                        path = fileDir;
                        rootFile = fileName;
                    }
                    else if (dir != " " && fileName != "")
                    //根目录下的第一级子文件夹下的文件
                    {
                        if (dir.IndexOf("\\") > 0)
                        //指定文件保存的路径
                        {
                            path = fileDir + "\\" + dir;
                        }
                    }

                    if (dir == rootDir)
                    //判断是不是需要保存在根目录下的文件
                    {
                        path = fileDir + "\\" + rootDir;
                    }

                    //以下为解压缩zip文件的基本步骤
                    //基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。
                    if (fileName != String.Empty)
                    {
                        FileStream streamWriter = System.IO.File.Create(path + "\\" + fileName);

                        int size = 2048;
                        byte[] data = new byte[2048];
                        while (true)
                        {
                            size = s.Read(data, 0, data.Length);
                            if (size > 0)
                            {
                                streamWriter.Write(data, 0, size);
                            }
                            else
                            {
                                break;
                            }
                        }

                        streamWriter.Close();
                    }
                }
                s.Close();
                System.IO.File.Delete(TargetFile);
                return rootFile;
            }
            catch (Exception ex)
            {
                return "1; " + ex.Message;
            }
        }

  

 

时间: 2024-10-14 06:07:15

winform程序压缩文件上传,服务器端asp.net mvc进行接收解压的相关文章

增删查改实现多文件上传, 采用ASP.NET MVC 5 and EF 6

public class Support { public int SupportId { get; set; } [Required(ErrorMessage="please enter your Name")] [Display(Name="Name")] [MaxLength(100)] public string Name { get; set; } [Required(ErrorMessage="plese enter summary"

[转]ExtJs入门之filefield:文件上传的配置+结合Ajax完美实现文件上传的asp.net示例

原文地址:http://www.stepday.com/topic/?459 作文一个ExtJs的入门汉子,学习起来的确是比较费劲的事情,不过如今在这样一个网络资源如此丰富的时代,依然不是那么难了的.基本上都是Copy过来加以部分改造即可实现自己想要的功能,加之如今的第三方开发者也大发慈悲地写出了API的帮助文档以及示例文档.关于ExtJs内的文件上传,将从以下几个方面进行展开讲解: 一.ExtJs文件上传版面的布局以及配置 因为ExtJs的文件上传组件filefield是基于form表单提交数

C# winform把本地文件上传到服务器上,和从服务器上下载文件

昨天在做项目过程中遇到需要把本地文件上传到服务器上的问题,在这里记录一下,方便大家互相学习! /// <summary> /// 上传文件方法/// </summary> /// <param name="filePath">本地文件所在路径(包括文件)</param> /// <param name="serverPath">文件存储服务器路径(包括文件)</param> public voi

带进度条的上传(Asp.net+MVC+Uploadify)

1.Uploadify简介 Uploadify是基于jQuery的一种上传插件,支持多文件.带进度条显示上传,在项目开发中常被使用. Uploadify官方网址:http://www.uploadify.com/ 2.ASP.NET MVC3中的使用Uploadify 搭建ASP.NET MVC3解决方案如下图,其中使用到的Uploadify为3.1版本: 1>.简单示例 _Layout.cshtml代码: <!DOCTYPE html> <html> <head>

怎样将压缩文件上传到服务器上

前言: 由于项目api是一台服务器,upload也是一台服务器,所以整体思路就是 1,先将zip上传到upload服务器 2,在upload服务器上解压zip. 3,在upload服务器上处理解压的文件(基本上都是json string) 4,通过接口调用将json string传入到接口中,进行数据库的操作 一.html <input id="discoverImg" type="file" name="" class="lay

应用HtmlInputFile进行大文件上传 解决asp.net上传大文件默认文件大小限制

选择一个文件,也可以正确上传至服务器,但您会发现文件大于2048的时候,出现:Internet Explorer显示 "The page cannot be displayed - Cannot find server or DNS Error",并且是怎么也catch不了这个错误. 解决的办法如下: 在web.config文件中增加上面代码,将可以解决上诉文件,这样小于10M的文件都没有问题 <system.web> <httpRuntime  executionT

文件上传时如何携带参数和接收返回值(亲测有效)

1.页面 2.js 3.java后台接收 亲测有效 原文地址:https://www.cnblogs.com/ysyy/p/12174535.html

基于uploadify.js实现多文件上传和上传进度条的显示

uploadify是JQuery的一个插件,主要实现文件的异步上传功能,可以自定义文件大小限制.文件类型.是否自动上传等属性,可以显示上传的进度条.官网地址是http://www.uploadify.com/,进入官网首页(不截图了,其实也没啥看的),可以看到uploadify的标语"Upload files like magic",意思是说使用uploadify上传文件如魔法一般.目前一共分为两个版本,Flash版和HTML5版,不过HTML5版是收费的,如图: 这里我们下载Flas

基于cxf的app文件上传接口(带回显功能)

1.SaleImpl @Override public String uploadPic(final List<Attachment> attachments) { return this.filterException(new MethodCallBack() { @Override public String doProcessMethod() throws Exception { List<FileUploadVo> fileVos = transform2FileUploa