문제

나는 사용하고있다 <input type="file" id="fileUpload" runat="server"> ASP.NET 응용 프로그램에서 파일을 업로드합니다.업로드 파일 형식을 제한하고 싶습니다(예:.xls 또는 .xlsx 파일 확장자로 제한됨).

JavaScript 또는 서버측 검증 모두 괜찮습니다(파일이 업로드되기 전에 서버측 검증이 수행되는 한 - 매우 큰 파일이 업로드될 수 있으므로 실제 파일이 업로드되기 전에 검증이 수행되어야 함) .

도움이 되었습니까?

해결책

업로드 전에 확인이 이루어지기를 원하므로 옵션이 제한될 것 같습니다.내 생각에 당신이 얻을 수 있는 최선의 방법은 자바스크립트를 사용하여 파일 확장자의 유효성을 검사하는 것입니다.유효한 확장자의 해시를 구축한 다음 업로드되는 파일의 확장자가 해시에 존재하는지 확인할 수 있습니다.

HTML:

<input type="file" name="FILENAME"  size="20" onchange="check_extension(this.value,"upload");"/>
<input type="submit" id="upload" name="upload" value="Attach" disabled="disabled" />

자바스크립트:

var hash = {
  'xls'  : 1,
  'xlsx' : 1,
};

function check_extension(filename,submitId) {
      var re = /\..+$/;
      var ext = filename.match(re);
      var submitEl = document.getElementById(submitId);
      if (hash[ext]) {
        submitEl.disabled = false;
        return true;
      } else {
        alert("Invalid filename, please select another file");
        submitEl.disabled = true;

        return false;
      }
}

다른 팁

정규식 유효성 검사기를 사용하면 매우 간단합니다.

<asp:RegularExpressionValidator
id="RegularExpressionValidator1"
runat="server"
ErrorMessage="Only zip file is allowed!"
ValidationExpression ="^.+(.zip|.ZIP)$"
ControlToValidate="FileUpload1"
> </asp:RegularExpressionValidator>

업로드가 허용되는 파일 형식의 클라이언트 측 유효성 검사

자바스크립트의 onsubmit 핸들러에서 파일 이름을 얻을 수 있어야 합니다.따라서 귀하의 경우에는 다음과 같이 해야 합니다:

<form onsubmit="if (document.getElementById('fileUpload').value.match(/xls$/) || document.getElementById('fileUpload').value.match(/xlsx$/)) { alert ('Bad file type') ; return false; } else { return true; }">...</form>

나는 Chris의 말에 동의합니다. 확장자를 확인하는 것은 파일 형식을 확인하는 것이 아닙니다. Telerik의 rad업로드 아마도 최선의 선택일 것입니다. 업로드되는 파일의 ContentType 속성을 제공하며, 이를 알려진 MIME 유형과 비교할 수 있습니다.다음 사항을 확인해야 합니다.

애플리케이션/vnd.ms-excel,

애플리케이션/엑셀,

응용 프로그램/x-msexcel

새로운 2k7 형식의 경우:

application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik은 radUpload를 개별 구성 요소로 판매했지만 지금은 컨트롤 제품군에 포함되어 있어 약간 더 비싸지만 실제 유형을 확인하는 가장 쉬운 방법입니다.

업로드 컨트롤에서 정규식 유효성 검사기를 사용할 수 있습니다.

  <asp:RegularExpressionValidator id="FileUpLoadValidator" runat="server" ErrorMessage="Upload Excel files only." ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.xls|.XLS|.xlsx|.XLSX)$" ControlToValidate="fileUpload"> </asp:RegularExpressionValidator>

입력 태그의 accept 속성도 있습니다:

<input type="file" accept="application/msexcel" id="fileUpload" runat="server">

하지만 이것을 시도했을 때 많은 성공을 거두지 못했습니다(FF3 및 IE7 사용).

일부 사람들이 언급했듯이 Javascript가 갈 길입니다.여기서 "검증"은 파일 확장자에 의해서만 수행되며 파일이 실제 Excel 스프레드시트인지 검증하지는 않습니다.

파일 콘텐츠 유형을 확인하라는 kd7의 답변을 바탕으로 래퍼 방법은 다음과 같습니다.

private bool FileIsValid(FileUpload fileUpload)
{
    if (!fileUpload.HasFile)
    {
        return false;
    }
    if (fileUpload.PostedFile.ContentType == "application/vnd.ms-excel" ||
        fileUpload.PostedFile.ContentType == "application/excel" ||
        fileUpload.PostedFile.ContentType == "application/x-msexcel" ||
        fileUpload.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" //this is xlsx format
        )
        return true;

    return false;
}

업로드할 파일이 .xls 또는 .xlsx인 경우 true를 반환합니다.

누구도 파일을 업로드할 수 없도록 항상 서버 측에서 파일 확장자를 확인하세요. 악성 파일 .aspx, .asp 등과 같은

글쎄요 - 포스트백 중에 파일이 제출(업로드)되므로 포스트백 시 서버 측에서 이를 수행할 수 없습니다.

JavaScript를 사용하여 클라이언트에서 이를 수행할 수 있을 것이라고 생각합니다.개인적으로 저는 다음과 같은 타사 구성 요소를 사용합니다. Telerik의 rad업로드.우수한 클라이언트 측 및 서버 측 API를 갖추고 있으며 대용량 파일 업로드를 위한 진행률 표시줄을 제공합니다.

오픈 소스 솔루션도 사용 가능하다고 확신합니다.

나는 이를 수행하는 방법이 다양하다고 생각합니다.나는 ASP에 익숙하지 않기 때문에 특정 파일 형식을 확인하기 위한 몇 가지 힌트만 제공할 수 있습니다.

1) 안전한 방법:전달하려는 파일 형식의 헤더에 대한 자세한 정보를 얻으십시오.업로드된 파일을 구문 분석하고 헤더를 비교합니다.

2) 빠른 방법:파일 이름을 두 부분으로 나눕니다 -> 파일 이름과 파일 끝.파일의 끝부분을 확인하고 업로드를 허용하려는 파일 형식과 비교하세요.

도움이 되길 바랍니다 :)

표준 Asp.Net 컨트롤을 피하고 Brettle Development의 NeadUpload 구성 요소를 사용하십시오. http://www.brettle.com/neatupload

더 빠르고 사용하기 쉬우며 구성 파일의 maxRequestLength 매개변수에 대해 걱정할 필요가 없으며 통합도 매우 쉽습니다.

대체 옵션으로 허용되는 MIME 유형을 정의하는 HTML 파일 입력의 "accept" 속성을 사용할 수 있습니까?

정의 여기

유일한 옵션은 클라이언트 측 유효성 검사인 것 같습니다. 서버 측에서는 파일이 이미 업로드되었음을 의미하기 때문입니다.또한 MIME 유형은 일반적으로 파일 확장자에 따라 결정됩니다.

jQuery와 같은 JavaScript 프레임워크를 사용하여 양식의 onsubmit 이벤트를 오버로드합니다.그런 다음 확장자를 확인하십시오.이렇게 하면 대부분의 시도가 제한됩니다.그러나 사람이 이미지를 확장자 XLS로 변경하면 문제가 발생합니다.

이것이 귀하에게 적합한 옵션인지는 모르겠지만 Silverlight나 Flash와 같은 것을 사용하여 업로드할 때 더 많은 클라이언트측 제어 권한을 갖게 됩니다.업로드 프로세스에 이러한 기술 중 하나를 사용하는 것을 고려할 수 있습니다.

다른 응답자가 언급했듯이 파일 형식은 스푸핑될 수 있으며(예: .exe의 이름이 .pdf로 변경됨) MIME 형식을 확인해도 방지할 수 없습니다(예: .exe로 이름이 변경된 경우 .exe에서 "application/pdf"라는 MIME이 표시됨). pdf).나는 실제 파일 형식을 확인하는 것은 서버 측에서만 수행할 수 있다고 생각합니다.System.IO.BinaryReader를 사용하여 확인하는 쉬운 방법은 다음과 같습니다.

http://forums.asp.net/post/2680667.aspx

VB 버전은 다음과 같습니다.

http://forums.asp.net/post/2681036.aspx

확인하려는 파일 형식에 대한 바이너리 '코드'를 알아야 하지만 이 솔루션을 구현하고 코드를 디버깅하면 코드를 얻을 수 있습니다.

클라이언트 측 유효성 검사:-

HTML:

<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btnUpload" runat="server" Text="Upload" OnClientClick = "return ValidateFile()"  OnClick="btnUpload_Click"  />
<br />
<asp:Label ID="Label1" runat="server" Text="" />

자바스크립트:

<script type ="text/javascript">

    var validFilesTypes=["bmp","gif","png","jpg","jpeg","doc","xls"];

    function ValidateFile()

    {

      var file = document.getElementById("<%=FileUpload1.ClientID%>");

      var label = document.getElementById("<%=Label1.ClientID%>");

      var path = file.value;

      var ext=path.substring(path.lastIndexOf(".")+1,path.length).toLowerCase();

      var isValidFile = false;

      for (var i=0; i<validFilesTypes.length; i++)    
      {    
        if (ext==validFilesTypes[i])    
        {    
            isValidFile=true;    
            break;    
        }    
      }

      if (!isValidFile)    
      {    
        label.style.color="red";    
        label.innerHTML="Invalid File. Please upload a File with" +    
         " extension:\n\n"+validFilesTypes.join(", ");    
      }    
      return isValidFile;    
     }    
</script>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top