입력 유형 = 파일을 만드는 방법은 pdf 및 xls 만 허용해야합니다.


102

나는 사용했다 <input type= "file" name="Upload" >

이제 .pdf 및 .xls 파일 만 허용하여이를 제한하고 싶습니다.

제출 버튼을 클릭하면이를 확인해야합니다.

웹 페이지에서 파일 (PDF / XLS)을 클릭하면 자동으로 열립니다.

누구든지 이것에 대한 몇 가지 예를 들어 주시겠습니까?

답변:


179

속성을 사용하고 accept허용 된 MIME 유형을 추가하여이를 수행 할 수 있습니다. 그러나 모든 브라우저가 해당 속성을 존중하는 것은 아니며 일부 코드 검사기를 통해 쉽게 제거 할 수 있습니다. 따라서 두 경우 모두 서버 측에서 파일 유형을 확인해야합니다 (두 번째 질문).

예:

<input type="file" name="upload" accept="application/pdf,application/vnd.ms-excel" />

세 번째 질문 "웹 페이지에서 파일 (PDF / XLS)을 클릭하면 자동으로 열립니다."

당신은 그것을 달성 할 수 없습니다. 클라이언트 컴퓨터에서 PDF 또는 XLS를 여는 방법은 사용자가 설정합니다.


안녕하세요 feeela 파일을 업로드하면 서버에 저장됩니다. 나는 그것이 ... 브라우저에서 파일을 클릭하여 열려있는 .PDF와 .XLS 파일에 자바 스크립트 함수가 가능하도록 들었
Manikandan

그게 다야! 양쪽 클라이언트 및 서버 설명. 멋진 대답

3
선택 상자에 모든 파일을 나열하는 경우. 여전히 모든 파일을 업로드 할 수 있습니다.
rüff0

59

이것을 사용할 수 있습니다.

HTML

<input name="userfile" type="file" accept="application/pdf, application/vnd.ms-excel" />

지원 만. PDF 및. XLS 파일


14

안타깝게도 선택시 보장 할 수있는 방법은 없습니다.

일부 브라우저 acceptinput태그 속성을 지원합니다 . 이것은 좋은 시작이지만 완전히 신뢰할 수는 없습니다.

<input type="file" name="pic" id="pic" accept="image/gif, image/jpeg" />

a를 사용하고 cfinput유효성 검사를 실행하여 제출시 파일 확장자 를 확인할 수 있지만 MIME 유형은 확인할 수 없습니다. 이것은 더 좋지만 여전히 어리석은 것은 아닙니다. OSX의 파일에는 파일 확장자가없는 경우가 많거나 사용자가 파일 형식을 악의적으로 잘못 지정할 수 있습니다.

ColdFusion 은 결과 속성 ( )을 cffile사용하여 MIME 유형 을 확인할 수 있지만 업로드 후에 만 수행 할 수 있습니다. 이것이 최선의 방법이지만 MIME 유형이 여전히 잘못 될 수 있으므로 여전히 100 % 안전하지는 않습니다.contentTypecffile.contentType


3
확장자를 기반으로 파일을 절대 확인하지 마십시오. lolcat.jpg라는 실행 파일은 어떻습니까?
feeela

1
phantom42가 여기서 말하려는 것은 서버에서 확장자와 MIME 유형을 확인해야한다는 것입니다. 태그 의 accept속성을 input추가 할 수 있지만 100 % 유효하지는 않습니다.
Chris Peters

100 % 동의합니다. 신뢰할 수는 없지만 cffile.contenttype과 함께 사용하면 첫 번째 방어선으로 괜찮습니다.
Joe C

안녕하세요 팬텀 당신이 말했듯이 이것은 IE가 아닌 크롬에서만 작동합니다. 모든 브라우저에 의해 지원 될 것입니다이 작업을 수행하는 anyother 방법이
Manikandan

불행하게도; 그렇기 때문에 신뢰할 수 없으며 전혀 사용하는 경우 다른 방법과 함께 사용해야한다고 말했습니다.
Joe C

4

JavaScript를 사용할 수 있습니다. JavaScript로이 작업을 수행하는 데있어 가장 큰 문제는 입력 파일을 재설정하는 것임을 고려하십시오. 음, 이것은 JPG로만 제한됩니다 (PDF의 경우 MIME 유형매직 넘버 를 변경해야합니다 ).

<form id="form-id">
  <input type="file" id="input-id" accept="image/jpeg"/>
</form>

<script type="text/javascript">
    $(function(){
        $("#input-id").on('change', function(event) {
            var file = event.target.files[0];
            if(file.size>=2*1024*1024) {
                alert("JPG images of maximum 2MB");
                $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                return;
            }

            if(!file.type.match('image/jp.*')) {
                alert("only JPG images");
                $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                return;
            }

            var fileReader = new FileReader();
            fileReader.onload = function(e) {
                var int32View = new Uint8Array(e.target.result);
                //verify the magic number
                // for JPG is 0xFF 0xD8 0xFF 0xE0 (see https://en.wikipedia.org/wiki/List_of_file_signatures)
                if(int32View.length>4 && int32View[0]==0xFF && int32View[1]==0xD8 && int32View[2]==0xFF && int32View[3]==0xE0) {
                    alert("ok!");
                } else {
                    alert("only valid JPG images");
                    $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                    return;
                }
            };
            fileReader.readAsArrayBuffer(file);
        });
    });
</script>

이것이 Firefox 및 Chrome의 최신 버전과 IExplore 10에서 테스트되었음을 ​​고려하십시오.

MIME 유형의 전체 목록은 Wikipedia를 참조하십시오 .

매직 넘버의 전체 목록은 Wikipedia를 참조하십시오 .


4

다음과 같이 시도해 볼 수 있습니다.

<input type= "file" name="Upload" accept = "application/pdf,.csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">

또는 (asp.net mvc에서)

@Html.TextBoxFor(x => x.FileName, new { @id = "doc", @type = "file", @accept = "application/pdf,.csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" })

2

셸을 포함한 모든 파일을 업로드 할 수있는 Firefox의 라이브 HTTP 헤더와 같은 도구가 있기 때문에 파일 서버 측을 필터링합니다. 사람들이 귀하의 사이트를 해킹 할 수 있습니다. 안전을 위해 서버 사이트를 수행하십시오.


이것은 사실입니다! 이 조언을 무시하지 마십시오
Rodney Salcedo

1

이 특정 예는 다중 파일 업로드에 대한 것이지만 필요한 일반 정보를 제공합니다.

https://developer.mozilla.org/en-US/docs/DOM/File.type

/ download /에서 파일에 대해 작업하는 한 이것은 자바 스크립트 질문이 아니라 서버 구성입니다. 사용자가 PDF 또는 XLS 파일을 열 수있는 항목이 설치되어 있지 않은 경우 다운로드 할 수 있습니다.


0

파일 업로드 컨트롤을 사용자가 버튼 클릭으로 업로드 할 수있는 파일 유형을 제한하려면 이것이 방법입니다.

<script type="text/JavaScript">
<!-- Begin
function TestFileType( fileName, fileTypes ) {
if (!fileName) return;

dots = fileName.split(".")
//get the part AFTER the LAST period.
fileType = "." + dots[dots.length-1];

return (fileTypes.join(".").indexOf(fileType) != -1) ?
alert('That file is OK!') : 
alert("Please only upload files that end in types: \n\n" + (fileTypes.join(" .")) + "\n\nPlease select a new file and try again.");
}
// -->
</script>

그런 다음 위 버튼의 onClick과 같은 이벤트에서 함수를 호출 할 수 있습니다.

onClick = "TestFileType (this.form.uploadfile.value, [ 'gif', 'jpg', 'png', 'jpeg']);"

이 작업을하기 위해 변경할 수 있습니다 PDFXLS

여기에서 구현 된 것을 볼 수 있습니다. 데모


감사합니다 Vishal Suthar. 나는이 논리가 내가 앞으로 나아가는 데 확실히 도움이된다고 생각한다.
Manikandan

그것은 내 pleasure..It는 여전히 upvote에 도움 있는지 없지만 것입니다 .. ?? Manikandan @
이씨 Suthar에게

아직도 한 가지 더 의심이 있습니다. 입력 유형 = 파일에서 파일 (PDF & Xls.xlsx 만 해당)을 제한하려고했습니다. 하지만 Google 크롬에서는 잘 작동합니다.하지만 IE에서는이 작업을 수행 할 수 없습니다. IE에서 파일을 제한하는 솔루션이 있습니까? 그렇다면 올바른 길로 가도록하십시오.
Manikandan

난 그냥 (확인 codestore.net/store.nsf/unid/DOMM-4Q8H9E을 IE에서)하고 그것을 잘 작동합니다 .. @ Manikandan
이씨 Suthar

accept-attribute와 비교 하여이 방법은 로컬 시스템에서 파일을 선택할 때 폴더 내용을 선택한 파일 유형으로 좁히지 않습니다.
feeela
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.