JQuery에서 파일 입력에서 데이터 가져 오기


136

실제로 파일 입력이 있고 파일의 Base64 데이터를 검색하고 싶습니다.

나는 시도했다 :

$('input#myInput')[0].files[0] 

데이터를 검색합니다. 그러나 이름, 길이, 내용 유형 만 제공하지만 데이터 자체는 제공하지 않습니다.

Amazon S3로 전송하려면 실제로 이러한 데이터가 필요합니다.

이미 API를 테스트했으며 인코딩 형식이 "multipart / form-data"인 html 양식을 통해 데이터를 보낼 때 작동합니다.

이 플러그인을 사용합니다 : http://jasny.github.com/bootstrap/javascript.html#fileupload

그리고이 플러그인은 그림의 미리보기를 제공하며 이미지 미리보기의 src 속성에서 데이터를 검색합니다. 그러나이 데이터를 S3에 보내면 작동하지 않습니다. "multipart / form-data"와 같은 데이터를 인코딩해야 할 수도 있지만 이유를 모르겠습니다.

html 양식을 사용하지 않고 이러한 데이터를 검색하는 방법이 있습니까?


컨텐츠를 가지려면 어떤 방식으로 (iframe, ajax, flash 또는 전통적인 형식으로) 업로드해야합니다.
브래드 크리스티

먼저 파일을 서버에 업로드해야합니다.
Sven van Zoelen

3
브라우저가 새로운 파일 API를 지원하는 경우 ( html5rocks.com/en/tutorials/file/dndfiles 참조 )
devnull69

실제로이 플러그인 jasny.github.com/bootstrap/javascript.html#fileupload를 사용 하고 있으며 데이터가 어딘가에 있도록 파일 미리보기를 얻을 수 있습니다.
kschaeffler

이 경우 "데이터"는 서버에 있습니다. 당신은 당신이 자바 스크립트 / jQuery를 통해 액세스 할 수 있습니다 출력 클라이언트 (브라우저)에 데이터를해야합니다
devnull69

답변:


134

FileReader API를 사용해 볼 수 있습니다. 다음과 같이하십시오 :

<!DOCTYPE html>
<html>
  <head>
    <script>        
      function handleFileSelect()
      {               
        if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
          alert('The File APIs are not fully supported in this browser.');
          return;
        }   
      
        var input = document.getElementById('fileinput');
        if (!input) {
          alert("Um, couldn't find the fileinput element.");
        }
        else if (!input.files) {
          alert("This browser doesn't seem to support the `files` property of file inputs.");
        }
        else if (!input.files[0]) {
          alert("Please select a file before clicking 'Load'");               
        }
        else {
          var file = input.files[0];
          var fr = new FileReader();
          fr.onload = receivedText;
          //fr.readAsText(file);
          //fr.readAsBinaryString(file); //as bit work with base64 for example upload to server
          fr.readAsDataURL(file);
        }
      }
      
      function receivedText() {
        document.getElementById('editor').appendChild(document.createTextNode(fr.result));
      }           
      
    </script>
  </head>
  <body>
    <input type="file" id="fileinput"/>
    <input type='button' id='btnLoad' value='Load' onclick='handleFileSelect();' />
    <div id="editor"></div>
  </body>
</html>


이봐, 나는 당신의 해결책을 시도해 보았습니다. 정보를 검색했지만 제대로 인코딩되지 않았습니다. 파일 \xc3\xbf\xc3의 경우이 \xff\xd8\xff그림을 내 그림의 첫 번째 3 문자로 인코딩하는 대신 얻을 수 있습니다. 사진의 두 번째 인코딩을 얻으려면 어떻게해야합니까?
kschaeffler

@kschaeffler 시도 fr.readAsDataURL (파일); 이것은 Base64 데이터를 읽는 기능이지만 아직 테스트하지 않았습니다.
Sark

실제로이 함수는 데이터가 충분하지 않습니다. 그것은 플러그인 jasny.github.com/bootstrap/javascript.html#fileupload에서 사용하는 미리보기에서 이미 가지고 있습니다. 검색 한 데이터가 Base64로 인코딩되지 않았으며 이것이 문제라고 생각하지만 확실하지 않습니다
kschaeffler

실제로 "multipart / form-data"인코딩 유형으로 HTML 양식을 게시 할 때 검색 한 것과 동일한 인코딩 데이터가 필요합니다.
kschaeffler

156

입력 파일 요소 :

<input type="file" id="fileinput" />

파일 받기 :

var myFile = $('#fileinput').prop('files');

12
완벽한 솔루션! 감사합니다. 단일 업로드, 인덱스 0 개선. var myFile = $ ( '# fileinput'). prop ( 'files') [0];
polras

훌륭합니다. 양식을 제출하지 않고도 스크립트를 Cloudinary와 함께 사용할 수 있습니다. 드래그 앤 드롭, 업로드 :)
Andy

바로 내가 필요한 것입니다.
Amete Blessed

좋은 대답 !! 당신은 다음과 변수를 이동할 수 있습니다$('.myClass').prop('files', myFile );
항상-A-학습자

54

양식 데이터 객체를 만들고 파일을 추가했습니다.

var form = new FormData(); 
form.append("video", $("#fileInput")[0].files[0]);

그리고 나는 얻었다 :

------WebKitFormBoundaryNczYRonipfsmaBOK
Content-Disposition: form-data; name="video"; filename="Wildlife.wmv"
Content-Type: video/x-ms-wmv

보낸 헤더에. 파일이 서버의 폴더에 전송되어 저장되었으므로이 작동을 확인할 수 있습니다. FormData 객체를 사용하는 방법을 모른다면 온라인 설명서가 있지만 그다지 많지 않습니다. Mozilla의 양식 데이터 오브젝트 설명


37

HTML :

<input type="file" name="input-file" id="input-file">

jQuery :

var fileToUpload = $('#input-file').prop('files')[0];

prop ( 'files')가 배열을 반환하기 때문에 첫 번째 요소 만 가져오고 싶습니다.


16

input 유형의 요소 file

<input id="fileInput" type="file" />

당신에 input변화를 사용하는 FileReader개체를하고 읽을 input파일 속성을 :

$('#fileInput').on('change', function () {
    var fileReader = new FileReader();
    fileReader.onload = function () {
      var data = fileReader.result;  // data <-- in this var you have the file data in Base64 format
    };
    fileReader.readAsDataURL($('#fileInput').prop('files')[0]);
});

FileReader는 파일을로드 fileReader.result하고 파일 데이터는 Base64 형식 (MIME (파일 내용 형식), 텍스트 / 일반, 이미지 / jpg 등)으로되어 있습니다.


9

jQuery가 포함 된 FileReader API (간단한 예)

( function ( $ ) {
	// Add click event handler to button
	$( '#load-file' ).click( function () {
		if ( ! window.FileReader ) {
			return alert( 'FileReader API is not supported by your browser.' );
		}
		var $i = $( '#file' ), // Put file input ID here
			input = $i[0]; // Getting the element from jQuery
		if ( input.files && input.files[0] ) {
			file = input.files[0]; // The file
			fr = new FileReader(); // FileReader instance
			fr.onload = function () {
				// Do stuff on onload, use fr.result for contents of file
				$( '#file-content' ).append( $( '<div/>' ).html( fr.result ) )
			};
			//fr.readAsText( file );
			fr.readAsDataURL( file );
		} else {
			// Handle errors here
			alert( "File not selected or browser incompatible." )
		}
	} );
} )( jQuery );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="file" />
<input type='button' id='load-file' value='Load'>
<div id="file-content"></div>

텍스트로 읽으려면 ... 주석 해제 //fr.readAsText(file);및 주석fr.readAsDataURL(file);


0
 <script src="~/fileupload/fileinput.min.js"></script>
 <link href="~/fileupload/fileinput.min.css" rel="stylesheet" />

fileinput이라는 위의 파일을 다운로드하여 색인 페이지에 경로를 추가하십시오.

<div class="col-sm-9 col-lg-5" style="margin: 0 0 0 8px;">
<input id="uploadFile1" name="file" type="file" class="file-loading"       
 `enter code here`accept=".pdf" multiple>
</div>

<script>
        $("#uploadFile1").fileinput({
            autoReplace: true,
            maxFileCount: 5
        });
</script>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.