c#如何快速手动构建文件服务器

  介绍

小编给大家分享一下c#如何快速手动构建文件服务器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

下面是调用的一个测试使用的界面。

 C #如何快速手动构建文件服务器

测试上传和下载的功能。

相关教程:c#视频教程

<>强基本原理说一下:

1。客户端上传文件,转换成二进制流到服务器,服务器接收进行MD5加密,把文件及密码存入文件服务器库,文件根据MD5保存进本地文件夹,文件夹命名第一级取MD5前二位,第二级文件目录是MD5第3和4位,保存的文件重新命名,名称是当前加密的MD5。当然,加密储存需要验证的,如果本地已经存了这个MD5就认为已经保存了相同的文件,就不需要再保存。

2。下载文件的时候直接通过该MD5取文件即可。

 C #如何快速手动构建文件服务器

上图是基本流程,逻辑上还是有漏洞,实际上又有改动。基本流程是这样了,可以大概看看,懒得再划一个图了。

<>强服务端结构:

 C #如何快速手动构建文件服务器

<强> FileService。asmx 强提供服务,核心代码在FileCoreService.cs。本项目用的衣冠楚楚的,简单方便,实用。

<强> WebApplication1 强就是测试用的,客户端调用的了。

WFBPMFile可以忽略了,我的一个转换功能,原先文件是文件流存入数据库里的,大概100克,然后转换成文件,放入文件服务器了。

核心代码放出来吧,喜欢的可以拿去。

;
  使用系统;
  使用System.Collections.Generic;
  使用System.Data;
  使用来;
  使用System.Diagnostics;
  使用先;
  使用System.Security.Cryptography;
  使用text;
  
  名称空间FZ.File.Logic
  {
  公开课FileCoreService
  {///& lt; summary>///根据文件名和MD5检查是否存在,检查文件名和MD5都存在///& lt;/summary>///& lt;参数name=癴ilename"在文件名& lt;/param>///& lt;参数name=癿d5str"在文件流加密的MD5///& lt; returns> & lt;/returns>
  公共bool CheckFilNameMD5(文件名字符串,字符串md5str)
  {
  使用(IDbConnection康涅狄格州=DBConfig.GetSqlConnection ())
  {
  试一试
  {
  字符串sql=癝ELECT COUNT(*)从BPM_tb_UploadFile(文件名)=@FileName FileMD5=@FileMD5“;;//sql=String.Format (sql、文件名、md5str);//var计算=conn.ExecuteScalar (sql,空,空,空,CommandType.Text);
  var参数=new动态参数();
  param.Add (“@FileName"文件名);
  param.Add (“@FileMD5" md5str);
  var计算=conn.ExecuteScalar (sql、参数null, 3600, CommandType.Text);
  如果((int)数比;0)
  {
  返回true;
  }
  }
  捕获(异常交货)
  {
  把交货;
  }
  }
  返回错误;
  }///& lt; summary>///验证数据的完整性(接收到的文件流MD5与接收到的MD5验证)///& lt;/summary>///& lt;参数name=癿d5str"在接收的MD5///& lt;参数name=皊ourceStream"在文件流& lt;/param>///& lt; returns> & lt;/returns>
  公共bool CheckMD5(字符串md5str系统。Byte [] sourceStream)
  {
  var jmd5=GetMD5HashByByte (sourceStream);
  如果(md5str==jmd5)
  {
  返回true;
  }
  返回错误;
  }
  公共bool InsertFile(系统。md5str Byte [] sourceStream,字符串,字符串文件名)
  {
  bool科幻=SaveFileToDisk (sourceStream,“D: \ \还是\ \“,md5str);//先保存文件
  如果(sf)
  {//要做插入数据库
  使用(IDbConnection康涅狄格州=DBConfig.GetSqlConnection ())
  {
  试一试
  {
  字符串sql=安迦隑PM_tb_UploadFile([文件],[FileMD5],[文件大小],[描述])值(& # 39;{0}& # 39;,& # 39;{1}& # 39;,{2},& # 39;{3}& # 39;)“;
  sql=字符串。格式(sql,文件名,md5str sourceStream。长度,““);
  var计算=conn.Execute (sql,空,空,空,CommandType.Text);//var param=新动态参数();//param.Add (“@FileName",文件名);//param.Add (“@FileMD5" md5str);//var计算=conn.Execute (sql、参数null, 3600, CommandType.Text);
  如果(计数比;0)
  {
  返回true;
  }
  }
  捕获(异常交货)
  {
  把交货;
  }
  }
  }
  返回错误;
  }//根据二进制流生成MD5
  私人字符串GetMD5HashByByte(系统。Byte [] sourceStream)
  {
  MD5 MD5=new MD5CryptoServiceProvider ();
  结果byte []=md5.ComputeHash (sourceStream);
  字符串ret=?“;
  for (int i=0;我& lt;result.Length;我+ +)
  ret +=结果[我].ToString (“x")。PadLeft (2, & # 39; 0 & # 39;);
  返回受潮湿腐烂;
  }//根据文件流生成MD5(与上一方法生成结果相同)
  私人GetMD5HashByFile字符串(字符串文件名)
  {
  文件=new FileStream文件流(文件名,FileMode.Open);
  MD5 MD5=new MD5CryptoServiceProvider ();
  结果byte []=md5.ComputeHash(文件);
  file.Close ();
  StringBuilder某人=new StringBuilder ();
  for (int i=0;我& lt;result.Length;我+ +)
  {
  [我].ToString sb.Append(结果(“x2"));
  }
  返回sb.ToString ();
  }//保存文件流到服务器上指定位置
  私人bool SaveFileToDisk(系统。Byte [] sourceStream,字符串fileFullName)
  {
  bool=false结果;
  试一试
  {//待保存的路径
  字符串savePath=Path.GetDirectoryName (fileFullName);
  如果(! Directory.Exists (savePath))
  {
  Directory.CreateDirectory (savePath);
  }
  
  使用(fsTarget=new FileStream文件流(fileFullName FileMode。创建、FileAccess。写,FileShare.None))
  {
  fsTarget。写(sourceStream 0 sourceStream.Length);
  fsTarget.Flush ();
  fsTarget.Close ();
  结果=true;
  }
  }
  最后
  {
  }
  返回结果;
  }
  
  私人bool SaveFileToDisk(系统。filepath Byte [] sourceStream,字符串,字符串md5)
  {
  bool=false结果;
  字符串fileFullName=filepath + md5。Substring (0, 2) +“\ \”;+ md5。子串(2,2)+“\ \”;+ md5;
  试一试
  {//待保存的路径
  字符串savePath=Path.GetDirectoryName (fileFullName);
  如果(! Directory.Exists (savePath))
  {
  Directory.CreateDirectory (savePath);
  }
  
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

c#如何快速手动构建文件服务器