C #에서 파일의 확장자를 찾는 방법은 무엇입니까?


135

내 웹 응용 프로그램 (asp.net, c #)에서 페이지에 비디오 파일을 업로드하고 있지만 flv 비디오 만 업로드하고 싶습니다. 다른 확장 동영상을 업로드 할 때 어떻게 제한 할 수 있습니까?


1
가능하면 불필요한 업로드를 피하기 위해 클라이언트도 확인하려고합니다.
Thilo

2
예, 그러나 아래 답변을 참조하십시오-고객 측 확인에 의존하지 마십시오-조만간 우회 될 것입니다. :)
ZombieSheep

4
클라이언트 측 검사는 서버를 보호하는 것이 아니라 사용자에게 편의를 제공합니다.
Thilo

당연하다. OP에 의존하지 말라고 조언합니다.
ZombieSheep

답변:


269

Path.GetExtension

string myFilePath = @"C:\MyFile.txt";
string ext = Path.GetExtension(myFilePath);
// ext would be ".txt"

8
이를 통해 누군가 파일 * .flv의 이름을 바꾸고 업로드 할 수 있습니다. 요구 사항에 따라 MIME 유형도 확인할 수 있습니다.
David Glenn

MIME 유형이 일반적으로 파일 이름 확장자에 따라 설정되지 않습니까?
Thilo

@Thilo, 맞습니다. 그러나 mime 컨텐츠 유형을 변경하지 않고도 확장자를 변경할 수 있습니다. MIME 형식은 파일에 포함 된 데이터를 설명하므로 적절하게 처리 할 수 ​​있습니다. en.wikipedia.org/wiki/MIME
Mark Dickinson

2
더 좋은 방법은 파일 내용을 확인하는 것입니다. flv 서명을 확인해야합니다.
Marat Faskhiev 2009

MIME 형식 인수는 둘 다 스푸핑 할 수있는 확장만큼 안전하지 않습니다. 두 검사의 조합은 아마도 합리적인 솔루션 일 것입니다. 그러나 궁극적으로 보안이 중요한 경우 서명되지 않은 파일 차단 또는 콘텐츠 샘플링과 같은보다 엄격한 검사가 있어야합니다.
제임스

21

단순히 파일 스트림을 읽을 수 있습니다

using (var target = new MemoryStream())
{
    postedFile.InputStream.CopyTo(target);
    var array = target.ToArray();
}

처음 5/6 인덱스는 파일 형식을 알려줍니다. FLV의 경우 70, 76, 86, 1, 5 입니다.

private static readonly byte[] FLV = { 70, 76, 86, 1, 5};

bool isAllowed = array.Take(5).SequenceEqual(FLV);

경우 isAllowed등호 true다음은 FLV.

또는

파일 내용 읽기

var contentArray = target.GetBuffer();
var content = Encoding.ASCII.GetString(contentArray);

처음 두세 글자는 파일 형식을 알려줍니다.
FLV의 경우 "FLV ......"

content.StartsWith("FLV")

3
이 등급이 더 높아야합니다. 응용 프로그램이 실제로 작동하고 데이터를 신뢰할 수없는 경우 시작 부분을 확인해야합니다.
PRMan

7

서버에서 MIME 유형을 확인할 수 있습니다. 여기 또는 Google에서 flv mime 유형을 검색하십시오.

MIME 유형이

video/x-flv

예를 들어 C #에서 FileUpload를 사용하고 있다면

FileUpload.PostedFile.ContentType == "video/x-flv"

5

이것이 당신이 원하는 것인지 확실하지 않지만 :

Directory.GetFiles(@"c:\mydir", "*.flv");

또는:

Path.GetExtension(@"c:\test.flv")

4

또한가있는 경우 FileInfo fi간단하게 수행 할 수 있습니다.

string ext = fi.Extension;

파일의 확장명을 보유합니다 (참고 :을 포함 .하므로 위의 결과는 다음 .jpg .txt과 같습니다 .


2

사용자가 클라이언트 측에서 업로드하는 파일 형식을 제한 할 수 없습니다 [*]. 서버 측에서만이 작업을 수행 할 수 있습니다. 사용자가 잘못된 파일을 업로드하면 파일이 업로드 된 후에 만 ​​파일을 인식 할 수 있습니다. 사용자가 원하는 파일 형식을 업로드하지 못하게하는 안전하고 안전한 방법은 없습니다.

[*] 예, 업로드를 시작하기 전에 파일 확장명을 감지하기 위해 모든 종류의 영리한 작업을 수행 할 수 있지만 파일에 의존하지는 마십시오. 누군가 주위를 돌아 다니며 조만간 원하는 것을 업로드합니다.


1
해커가 원하는 것을 업로드하는 것을 막을 수는 없지만 여전히 클라이언트 측에서 사용자의 편의를 확인해야합니다. 플래시 업 로더는 파일 형식을 확인할 수 있어야합니다.
Thilo

1
OP는 플래시 업 로더에 대해 언급하지 않았습니다 (즉, '플래시 콘텐츠의 업 로더'가 아닌 '플래시로 작성된 업 로더'). 질문은 asp.net 및 c # 태그로 태그가 지정되며 이러한 기술 선택으로 클라이언트 측 검사가 제한되고 쉽게 물리 칠 수 있습니다. :)
ZombieSheep

비디오 업로드 사이트의 경우 클라이언트 측에서 HTML 업로드 양식보다 더 나은 것을 가져야합니다. 진행률 표시 줄이없는 다중 MB 업로드는 재미가 없습니다.
Thilo

확인 당신은 클라이언트 측 검사가 훨씬 좋은 내가 어떻게 서버 측 씨 ZombieSheep에서 확인할 수없는 말
수르야 sasidhar

@Thilo-더 이상 동의 할 수 없지만 ASP.net 업로드 양식에 관한 질문입니다. 그가 충분히 좋다고 생각하는지 여부는 OP에 달려 있습니다.
ZombieSheep


2

로 끝나다()

DotNetPerls 에서 경로를 지정할 필요가 없기 때문에 더 좋아진 대체 솔루션을 찾았습니다 . 다음은 사용자 정의 메소드를 사용하여 배열을 채운 예입니다.

        // This custom method takes a path 
        // and adds all files and folder names to the 'files' array
        string[] files = Utilities.FileList("C:\", "");
        // Then for each array item...
        foreach (string f in files)
        {
            // Here is the important line I used to ommit .DLL files:
            if (!f.EndsWith(".dll", StringComparison.Ordinal))
                // then populated a listBox with the array contents
                myListBox.Items.Add(f);
        }

2
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName);

위의 방법은 파이어 폭스와 IE에서 잘 작동합니다 .zip, txt, xls, xlsx, doc, docx, jpg, png와 같은 모든 유형의 파일을 볼 수 있습니다

그러나 googlechrome에서 파일의 확장자를 찾으려고하면 실패했습니다.


2

확장을 얻는 것과 동시에 확장을 제거하는 방법을 언급 할 가치가 있습니다.

var name = Path.GetFileNameWithoutExtension(fileFullName); // Get the name only

var extension = Path.GetExtension(fileFullName); // Get the extension only

0

이 솔루션은 또한 "Avishay.student.DB"와 같은 둘 이상의 확장의 경우에 도움이됩니다.

                FileInfo FileInf = new FileInfo(filePath);
                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.