2017-09-13 2 views
0

이미 존재하는지 확인하기 위해 저장하지 않고 MD5 해시를 확인하고 싶습니다. 아래 코드를 시도했지만 파일이 저장되지 않은 경우 파일의 MD5를 계산하지 않습니다. 바이트 배열에서 파일을 작성에 대해 생각하는 것은 그 바이트 배열의 MD5를 얻을 수 있지만 파일MD5를 확인하기 전에 파일을 컴퓨터에 저장하십시오.

public void ProcessRequest(HttpContext context) 
{ 
    if (context.Request.Files.Count > 0) 
    { 
     HttpFileCollection files = context.Request.Files; 
     for (int i = 0; i < files.Count; i++) 
     { 
      HttpPostedFile file = files[i]; 
      string ServerPath = context.Server.MapPath("~/uploads/" + file.FileName); 
      string Name = file.FileName; 
      string MD5 = GetMD5(ServerPath); 
      int Size = file.ContentLength; 
      string type = file.ContentType; 
      file.SaveAs(ServerPath); 
     } 
    } 
} 

을 없음 바이트 나를 떠나 병목 여기에 있기 때문에이 getMD5 방법

public string GetMD5(string fileName) 
{ 
    try 
    { 
     using (var md5 = MD5.Create()) 
     { 
      using (var stream = File.OpenRead(fileName)) 
      { 
       string Hash = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", ""); 
        return Hash; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 
+1

메모리에 모두 읽어 넣은 다음이를 확인한 다음 디스크에 기록해야합니다. 어느 쪽이든 그것은 모든 클라이언트에서 서버로 와야하므로 모든 대역폭을 절약하지 않을 것입니다. 내가 서버에서 temp 위치에 쓰고, MD5를 체크하고 이미 temp를 삭제했다면, 그렇지 않으면 정확한 위치에 복사한다. – musefan

+0

is not that too much time? – Tobi

+0

처음에 파일이 없어도 파일에 대한 MD5를 계산하려면 어떻게해야합니까?! 파일의 MD5에 사용자가 입력하도록 할 수 있습니다 ... 그들이 올바르게 할 수 있다고 믿을 수 있다면 – musefan

답변

0

입니다 다운로드, 당신은 T를 저장하지 않는 것이 진정한 이점이 아닙니다. 해시를 확인하기 전에 파일을 보냅니다. 당신이 할 수있는 일은 임시 폴더에 다운로드 한 다음 결국은 직접 삭제하거나 필요하지 않은 경우 OS가 정리하도록하는 것입니다.

확인 임시 폴더와 임시 파일을 사용하는 방법에 대한 자세한 내용은이 대답 : Writing File to Temp Folder

한 복잡한 옵션은 파일이 저장된 동일한 서버에 페이지를 호스팅하고는 MD5를 계산할 수 있도록 더이 다운로드하기 전에 MD5를 확인할 수 있습니다. 그렇지 않으면 해시가 파일을 구성하는 실제 바이트의 함수이기 때문에이를 계산하기 위해 전체 파일 (다운로드 또는 메모리 저장)이 필요합니다.

+0

나는 이것이 클라이언트 사용자 업로드 시나리오라고 가정합니다. MD5 값을 확인할 수있는 서버가 없을 것입니다. 그냥 파일 업로드 버튼 – musefan

+0

업로드와 간단한 웹 페이지 그래서 난 다른 경로 확인 MD5에 저장할 수 있습니다 그리고 뭐든간에 이 임시 폴더 내가 내 자신을 만들 수 있습니까? – Tobi

0

HttpPostedFile 클래스의 InputStream 속성을 사용할 수 있습니다. 해시를 계산하려면 HashAlgorithm 클래스의 ComputeHash 메서드를 사용하십시오.

public void ProcessRequest(HttpContext context) 
{ 
    if (context.Request.Files.Count > 0) 
    { 
     HttpFileCollection files = context.Request.Files; 
     for (int i = 0; i < files.Count; i++) 
     { 
      HttpPostedFile file = files[i]; 
      var hasAlg=HashAlgorithm.Create("MD5"); 
      var MD5= hasAlg.ComputeHash(file.InputStream); 

     } 

    } 
}