辉耀应用程序框架学习网

 辉耀应用程序框架学习网

关于本站

辉耀应用程序框架学习网致力于企业管理信息系统应用框架和开发实战,努力为中小企业和软件开发人员提供成熟的产品级框架。

HYAppFrame是一款基于Winform的应用程序框架,包含服务器Web Service、主程序框架、组织架构、权限控制、菜单导航、基础数据、系统参数、日志管理、定时任务、工作流引擎等。

地址:sourceforge.net

帐号:admin密码:123456

联系我们

HYAppFrame项目QQ群:
454986318

读者QQ群:
551444042

博客:CSDN

技术交流:百度贴吧

PDF有效期设置

新书推荐

31天学会CRM项目开发

HYAppFrame文件上传下载

本章节主要讲解HYAppFrame服务器端如何通过ASP.NET Web Service实现文件(含大文件)上传,客户端如何下载文件。

1     服务器端文件上传

1.1 上传文件

函数FileUpload(string fileFullPath, byte[] file)用于上传文件,生成文件前检查文件路径所在文件夹是否存在,不存在则首先创建文件夹。

  C# Code
1. [WebMethod(EnableSession = true, Description = "上传文件")]
2. public int FileUpload(string fileFullPath, byte[] file)
3. {
4.     try
5.     {
6.         // 取得文件夹
7.         string dir = fileFullPath.Substring(0, fileFullPath.LastIndexOf("\\"));
8.         //如果不存在文件夹,就创建文件夹
9.         if (!Directory.Exists(dir))
10.             Directory.CreateDirectory(dir);
11.         // 写入文件
12.         File.WriteAllBytes(fileFullPath, file);
13.         return 1;
14.     }
15.     catch (Exception ex)
16.     {
17.         MyFuncLib.Log(ex.Message + "\r\n" + ex.StackTrace);
18.         return -1;
19.     }
20. }

1.2 合并文件

经过实验通过Web Service上传文件,如果大小超过2M可能遇到上传失败的错误,所以客户端处理上传大文件时,先分割成小文件,逐一上传,然后再到服务器上合并成原始文件。

  C# Code
1. [WebMethod(EnableSession = true, Description = "合并文件")]
2. public int FileMerge(string fileFullPath, int num)
3. {
4.     try
5.     {
6.         int i = 0;
7.         FileStream fs = new  FileStream(fileFullPath, FileMode.Create, FileAccess.Write);
8.         while (num >= 0)
9.         {
10.             FileStream fsSource = new  FileStream(fileFullPath + i, FileMode.Open, FileAccess.Read);
11.             Byte[] buffer = new Byte[fsSource.Length];
12.             fsSource.Read(buffer, 0, Convert.ToInt32(fsSource.Length));
13.             fs.Write(buffer, 0, buffer.Length);
14.             fsSource.Close();
15.             num--;
16.             i++;
17.         }
18.         fs.Close();
19.         // 删除临时文件
20.         while (i >= 0)
21.         {
22.             File.Delete(fileFullPath + i);
23.             i--;
24.         }
25.         return 1;
26.     }
27.     catch (Exception ex)
28.     {
29.         MyFuncLib.Log(ex.Message + "\r\n" + ex.StackTrace);
30.         return -1;
31.     }
32. }

1.3 删除文件

函数FileDelete(string fileName)用于删除给定文件,删除前要检查用户是否通过身份验证,检查给定的文件路径是否包含特殊符号,例如,如果包含连续两个英文句号,使用者试图操作其他路径的文件。删除前,也要判断文件是否存在,删除后判断文件是否仍然存在,以此判断文件是否真正被删除。删除成功返回1,未删除任何文件返回0

  C# Code
1. [WebMethod(EnableSession = true, Description = "删除指定文件")]
2. public int FileDelete(string fileName)
3. {
4.     try
5.     {
6.         if (!IsLogin())
7.             return -100;
8.         fileName = MyFuncLib.WebDir + DES.Decrypt(fileName,MyFuncLib.passwordKey);
9.         // 不允许路径指向其他目录
10.         if (fileName.IndexOf("..") > -1)
11.             return 0;
12.         // 如果是文件夹,就跳过,不允许删除文件夹
13.         if (Directory.Exists(fileName))
14.             return 0;
15.         // 如果文件存在删除指定文件
16.         if (File.Exists(fileName))
17.             File.Delete(fileName);
18.         if (File.Exists(fileName))
19.             return 0;
20.         else
21.             return 1;
22.     }
23.     catch (Exception ex)
24.     {
25.         MyFuncLib.Log(ex.Message + "\r\n" + ex.StackTrace);
26.         return -1;
27.     }
28. }

2 客户端文件上传下载

2.1 文件上传

上传文件,支持多选,依次处理每一个文件。当待处理文件大小超过1M时,对其进行分割,并依次上传,当全部文件分割完毕后在服务器上合并。当文件上传后,需将文件的名称、存储路径、大小、类型、关联记录id等属性存入数据库。

  C# Code
1. private void UploadFile()
2. {
3.     try
4.     {
5.         this.progressBarX1.Value = 0;
6.         this.progressBarX1.Minimum = 0;
7.         string dirName = SysParameters.WebDir + webDir;
8.         OpenFileDialog ofg = new OpenFileDialog();
9.         ofg.Title = "选择文件";
10.         ofg.Filter = "所有文件|*.*";
11.         ofg.FilterIndex = 1;
12.         ofg.RestoreDirectory = true;
13.         ofg.Multiselect = true;
14.         if (ofg.ShowDialog() == DialogResult.OK)
15.         {
16.             this.warningBox1.Text = string.Empty;
17.             foreach (string fileName in ofg.FileNames)
18.             {
19.                 #region 逐一处理上传文件
20.                 string newName = Guid.NewGuid().ToString() + MyFuncLib.getFileNameExt(fileName);
21.                 using (FileStream fsSource = new FileStream(fileName, FileMode.Open, FileAccess.Read))
22.                 {
23.                     // Read the source file into a byte array.
24.                     long size = fsSource.Length;
25.                     if (size < int.MaxValue)
26.                         this.progressBarX1.Maximum = (int)size;
27.                     else
28.                         this.progressBarX1.Maximum = int.MaxValue - 1;
29.                     int unit = 1024000;
30.                     //如果文件体积小于1M,就一次性上传,如果文件大于1M就分割上传
31.                     if (size <= unit)
32.                     {
33.                         byte[] bytes = new byte[size];
34.                         int numBytesToRead = (int)size;
35.                         int numBytesRead = 0;
36.                         while (numBytesToRead > 0)
37.                         {
38.                             // Read may return anything from 0 to numBytesToRead.
39.                             int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);
40.                             // Break when the end of the file is reached.
41.                             if (n == 0)
42.                                 break;
43.                             numBytesRead += n;
44.                             numBytesToRead -= n;
45.                         }
46.                         numBytesToRead = bytes.Length;
47.                         MyFuncLib.WS.FileUpload(dirName + newName, bytes);
48.                         this.progressBarX1.Value = (int)size;
49.                     }
50.                     else
51.                     {
52.                         //倍数
53.                         int multiple = (int)(size / unit);
54.                         //余数
55.                         int residue = (int)(size - multiple * unit);
56.                         int i = 0;
57.                         while (multiple > 0)
58.                         {
59.                             byte[] bytes = new byte[unit];
60.                             int numBytesToRead = (int)unit;
61.                             int numBytesRead = 0;
62.                             while (numBytesToRead > 0)
63.                             {
64.                                 // Read may return anything from 0 to numBytesToRead.
65.                                 int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);
66.                                 // Break when the end of the file is reached.
67.                                 if (n == 0)
68.                                     break;
69.                                 numBytesRead += n;
70.                                 numBytesToRead -= n;
71.                             }
72.                             numBytesToRead = bytes.Length;
73.                             MyFuncLib.WS.FileUpload(dirName + newName + i, bytes);
74.                             multiple--;
75.                             i++;
76.                             this.progressBarX1.Value = i * unit;
77.                         }
78.                         if (residue > 0)
79.                         {
80.                             byte[] bytes = new byte[residue];
81.                             int numBytesToRead = (int)residue;
82.                             int numBytesRead = 0;
83.                             while (numBytesToRead > 0)
84.                             {
85.                                 // Read may return anything from 0 to numBytesToRead.
86.                                 int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);
87.                                 // Break when the end of the file is reached.
88.                                 if (n == 0)
89.                                     break;
90.                                 numBytesRead += n;
91.                                 numBytesToRead -= n;
92.                             }
93.                             numBytesToRead = bytes.Length;
94.                             MyFuncLib.WS.FileUpload(dirName + newName + i, bytes);
95.                         }
96.                         //在服务器上合并文件
97.                         MyFuncLib.WS.FileMerge(dirName + newName, i);
98.                     }
99.                     this.progressBarX1.Value = 0;
100.                     //将成功上传的文件写入数据库
101.                     if (this.cateName == null)
102.                         this.cateName = string.Empty;
103.  
104.                     string sql = "insert into core_attachment() values()";
105.                     ArrayList sqlParams = new ArrayList();
106.                     ……
107.                     MyFuncLib.DBCommandExecNoneQueryBySql(sql, sqlParams);
108.                     this.warningBox1.Text = "“" + fileName + "”文件已上传";
109.                 }
110.                 #endregion
111.             }
112.         }
113.     }
114.     catch (Exception ex) {
115.         MyFuncLib.logToDB("error", "系统错误", ex.Message, ex.StackTrace);
116.         MyFuncLib.msg("选择文件遇到错误," + ex.Message,"e");
117.     }
118. }

2.2 文件下载

函数Download(string url, string path)用于下载文件。给定一个文件网址,下载文件并提供进度条支持。由于服务器端使用IIS架设,ASP.NET Web Service提供服务的同时,本身也是一个Web站点,所以可通过一个网址下载服务器上指定文件。为了保证服务器文件安全,有两个策略。首先设置IIS禁止列出文件目录,然后将上传到服务器的文件使用GUID重命名,由于GUID唯一性、无规律性,且比较复杂,所以服务器上的文件路径不容易被猜测,从而保证文件相对安全。

  C# Code
1. private WebClient wc;
2.  
3. private void Download(string url, string path)
4. {
5.     try
6.     {
7.         Uri uri = new Uri(url);
8.         wc = new WebClient();
9.         wc.Proxy = null;//设置上网代理为空
10.         wc.DownloadFileCompleted += new  AsyncCompletedEventHandler(webClient_DownloadFileCompleted);
11.         wc.DownloadProgressChanged += new  DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
12.         wc.DownloadFileAsync(uri, path);
13.         this.label1.Text = "正在下载文件“" + oldName + "”";
14.     }
15.     catch (Exception ex) { MyFuncLib.msg("错误:连接服务器失败," + ex.Message, "e"); }
16. }
17.  
18. private void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
19. {
20.     this.progressBarX1.Value = e.ProgressPercentage;
21. }
22.  
23. private void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
24. {
25.     try
26.     {
27.         // 下载完成后打开指定文件
28.         System.Diagnostics.Process.Start(appPath + oldName);
29.         this.Close();
30.     }
31.     catch (Exception ex) { MyFuncLib.msg("错误:打开文件失败," + ex.Message, "e"); }
32. }

友情链接

Excel 网络函数库 | Excel 学习网 | 血战31天 | 刘政道 | 图标素材 IconArchive | Easy UI Demo | PrimeFaces

© 2015 - 辉耀应用程序框架学习网 - 鲁ICP备15007436号