2017-04-11 1 views
0

** Excel 형식 파일 하나를 만들고 확장 유형을 ". docx"로 변경했습니다. 업로드하려고하지만 콘텐츠 및 확장 유형 모두 다릅니다. 그럼 그 하나는 내가 마술 번호와 마임 타입과 함께 이것을 피하기 위해 몇 가지 코드를 시도했지만 마법의 숫자는 단어에 대한 동일하고 엑셀 및 우편 번호를 또한 내가 마임 타입도 변경 확장을 변경하면 차단해야합니다. 그래서 나는asp.net C에서 파일 확장자가 excel에서 word로 고유하게 변경되었습니다.

string FileExtension = FileName.Substring((FileName.LastIndexOf(".") + 1)).ToUpper(); 
string MagicNumber = HexaDecimalData.Substring(0, 47); 
string HexaDecimalData=string.Empty; 
string MimeType = MimeMapping.GetMimeMapping(_File.FileName); 
using (var fileStream = File.OpenRead(FileName)) 
{ 
BinaryReader Reader = new BinaryReader(fileStream); 
Reader.BaseStream.Position = 0x0; // The offset you are reading the data from 
byte[] data = Reader.ReadBytes(0x10); // Read 16 bytes into an array 
HexaDecimalData = BitConverter.ToString(data); 
Reader.Close(); 
} switch (FileExtension) 
{ 

           case "XLS": 
            if ((!MimeType.Equals("application/excel", StringComparison.OrdinalIgnoreCase) && 
             !MimeType.Equals("application/vnd.ms-excel", StringComparison.OrdinalIgnoreCase) && 
             !MimeType.Equals("application/x-excel", StringComparison.OrdinalIgnoreCase) && 
             !MimeType.Equals("application/x-msexcel", StringComparison.OrdinalIgnoreCase)) || 
             (!MagicNumber.StartsWith("D0-CF-11-E0-A1-B1-1A-E1"))) 
             ErrorMessage = "Invalid File"; 
            break; 
           case "XLSX": 
            if ((!MimeType.Equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", StringComparison.OrdinalIgnoreCase)) || 
             (!MagicNumber.StartsWith("50-4B-03-04") && !MagicNumber.StartsWith("50-4B-05-06") && !MagicNumber.StartsWith("50-4B-07-08"))) 
             ErrorMessage = "Invalid File"; 
            break; 
           case "PDF": 
            if ((!MimeType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase)) || (!MagicNumber.StartsWith("25-50-44-46"))) 
             ErrorMessage = "Invalid File"; 
            break; 
           case "DOCX": 
            if ((!MimeType.Equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document", StringComparison.OrdinalIgnoreCase)) || 
             (!MagicNumber.StartsWith("50-4B-03-04") && !MagicNumber.StartsWith("50-4B-05-06") && !MagicNumber.StartsWith("50-4B-07-08"))) 
             ErrorMessage = "Invalid File"; 
            break; 
           case "DOC": 
            if ((!MimeType.Equals("application/msword", StringComparison.OrdinalIgnoreCase)) || (!MagicNumber.StartsWith("D0-CF-11-E0-A1-B1-1A-E1"))) 
             ErrorMessage = "Invalid File"; 
            break; 


          } 

답변

1

링크 위에서 https://stackoverflow.com/a/14276391/911804

제발 봐 내가 MIME 타입과 매직 넘버 ****를 찾는 내 샘플 코드가 여기 ** 고유 식별자 에이 내용을 파악해야 :

그러나 "x"로 끝나는 모든 Office 2007 파일 형식은 압축 된 XML 문서 인 zip 입니다. 따라서이 방법은 100 % 안전하지는 않지만 일 경우 최소한 일부 필터를 걸러내는 데 도움이 될 수 있습니다.

업데이트 : 당신이 고용체는 다음을 시도하지만 시간이 소요됩니다합니다.

switch case 문에서 Office DLL을 사용하여 업로드 된 파일을 열어보십시오. 제대로 열면 올바른 형식입니다. 어셈블리 참조를 추가하고 Ms-Word 어셈블리 DLL의 기능을 사용합니다.

시간이 오래 걸릴 수 있지만 이는 100 % 솔루션을 제공합니다.

+0

excel 및 word에 대한 ur 설명문은 모두 동일한 ScanFileForMimeType "application/x-zip-compressed"을 반환합니다. 따라서 올바른 단어를 찾을 수 없습니다. –

+0

@ Subramaniyan.V 내 업데이트 된 답변 읽기, 그것은 'Renan'답변 –

0

올바른 형식 유효성 검사를하려면 손을 더러워야합니다. Open XML SDK으로 파일을 열어야합니다.

try-catch을 수행하십시오. try 블록이 성공적으로 끝나면 Word 문서입니다. catch 블록은 Word 문서가 아니거나 무언가가 손상되었다고 알려줍니다.

예를 들어

:

try 
{ 
    // "path" is a string with the path to the file. 
    // The "false" parameter indicates we don't intend do edit the file. 
    using (WordprocessingDocument doc = WordprocessingDocument.Open(path, false)) 
    { 
     // Seems like we got an ok file. 
    } 
} 
catch 
{ 
    // Let your user know that they should upload a proper Word file. 
} 

을하지만 그 이전에 MIME 검증을 시도 할, 그것은 당신에게 당신이 이미 유효한 문서로 알지 못하는 무언가를 열려고의 오버 헤드를 절약 할 수 있습니다.

+0

과 같은 형식의 파일 (Word, Excel, PDF)을 업로드 할 수 있습니다.하지만 콘텐츠와 확장명이 동일해야하는 유일한 조건으로 제한하고 싶습니다. WordprocessingDocument.Open을 사용할 수 없습니다. –

+0

{}을 (를) 사용하여 읽기 블록에서 시도했지만 작동하지 않습니다. –

+0

좋아, 두 가지 : 1) 형식을 확인하기 위해 문서를 열 수없는 방법을 알지 못합니다. 명시 적으로 열지 않으면 내용이 옳은지 절대 알 수 없으며 2) 무언가가 작동하지 않는다고 말하면 2) 스택 오버플로에서, 당신은 당신이 얻고있는 어떤 에러 메시지, 예상되는 행동 대 당신이 가진 것과 같은 세부 사항을 제공해야한다. – Renan

관련 문제