14年专业服务器托管租用服务商!
咨询热线 : 400-880-5868

首页 > 客服中心 > 帮助中心

帮助中心

文件服务器托管如何用哈希值判断图片是否重复上传

发布时间:2018-2-12 9:44:20    返回首页

  文件服务器托管,图片上传是常有的事,然而很多有时候用户由于没有对图片进行名称分类导致重复的传输造成主机存储空间不必要的浪费。这里介绍通过哈希值来分辨图片是否重复上传。

  /// <summary>

  /// 上传企业logo

  /// </summary>

  /// <returns></returns>

  public ActionResult UploadLogo(string comid)

  {

  HttpFileCollection files = System.Web.HttpContext.Current.Request.Files;

  if (files.Count == 0) return Json("没有没文件", JsonRequestBehavior.AllowGet);

  MD5 hash = new MD5CryptoServiceProvider();

  /**计算指定stream对象的哈希值**/

  byte[] bytehashValue = hash.ComputeHash(files[0].InputStream);

  var HashData = BitConverter.ToString(bytehashValue).Replace("-", "");

  var FileExtension = Path.GetExtension(files[0].FileName);

  var filename = comid + "_" + HashData + FileExtension;

  var virtualpath = string.Format("/Upload/Logo/{0}/{1}", DateTime.Now.ToString("yyyyMMdd"), filename);

  //将虚拟路劲转换成物理路劲

  var fullpath = Server.MapPath(virtualpath);

  var path = Path.GetDirectoryName(fullpath);

  if (!Directory.Exists(path))

  Directory.CreateDirectory(path);

  if (!System.IO.File.Exists(fullpath))

  files[0].SaveAs(fullpath);

  var FileSize = this.FileSize(files[0].ContentLength);

  return Json(new { FileName = filename, FilePath = virtualpath, FileSize = FileSize }, "text/html", JsonRequestBehavior.AllowGet);

  }

  /// <summary>

  /// 计算文件大小

  /// </summary>

  /// <param name="bytes"></param>

  /// <returns></returns>

  public string FileSize(long bytes)

  {

  long kblong = 1024;

  long mblong = 1024 * 1024;

  if (bytes < kblong)

  return decimal.Round(decimal.Divide(bytes, kblong), 2).ToString() + "KB";

  else

  return decimal.Round(decimal.Divide(bytes, mblong), 2).ToString() + "MB";

  }

  获取文件的hash哈希值方法:

  /// <summary>

  /// 计算文件的hash值 用于比较两个文件是否相同

  /// </summary>

  /// <param name="filePath">文件路径</param>

  /// <returns>文件hash值</returns>

  public static string GetFileHash(string filePath)

  {

  //创建一个哈希算法对象

  using (HashAlgorithm hash = HashAlgorithm.Create())

  {

  using (FileStream file = new FileStream(filePath, FileMode.Open))

  {

  //哈希算法根据文本得到哈希码的字节数组

  byte[] hashByte= hash.ComputeHash(file);

  //将字节数组装换为字符串

  return BitConverter.ToString(hashByte);

  }

  }

  }