รับข้อมูลจากการป้อนไฟล์ใน JQuery


145

ฉันมีอินพุตไฟล์จริงๆและฉันต้องการดึงข้อมูล Base64 ของไฟล์

ฉันเหนื่อย:

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

เพื่อดึงข้อมูล แต่จะให้เฉพาะชื่อความยาวประเภทเนื้อหา แต่ไม่ระบุข้อมูล

ฉันต้องการข้อมูลเหล่านี้เพื่อส่งไปยัง Amazon S3

ฉันทดสอบ API แล้วและเมื่อฉันส่งข้อมูลผ่านรูปแบบ html ที่มีการเข้ารหัสประเภท "multipart / form-data" ก็ใช้ได้

ฉันใช้ปลั๊กอินนี้: http://jasny.github.com/bootstrap/javascript.html#fileupload

และปลั๊กอินนี้ให้ฉันดูตัวอย่างรูปภาพและฉันดึงข้อมูลในแอตทริบิวต์ src ของการแสดงตัวอย่างรูปภาพ แต่เมื่อฉันส่งข้อมูลเหล่านี้ไปยัง S3 มันไม่ทำงาน ฉันอาจต้องเข้ารหัสข้อมูลเช่น "multipart / form-data" แต่ฉันไม่รู้ว่าทำไม

มีวิธีดึงข้อมูลเหล่านี้โดยไม่ใช้แบบฟอร์ม html หรือไม่?


เพื่อให้มีเนื้อหาคุณจะต้องอัปโหลดในรูปแบบบางอย่าง (iframe, ajax, flash หรือรูปแบบดั้งเดิม)
Brad Christie

ต้องอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์ก่อน
Sven van Zoelen

3
ไม่จำเป็นถ้าเบราว์เซอร์รองรับ File API ใหม่ (ดูhtml5rocks.com/en/tutorials/file/dndfiles )
devnull69

จริงๆแล้วฉันใช้ปลั๊กอินนี้jasny.github.com/bootstrap/javascript.html#fileuploadและฉันสามารถดูตัวอย่างไฟล์เพื่อให้ข้อมูลอยู่ที่ใดที่หนึ่ง
kschaeffler

ในกรณีนี้ "ข้อมูล" จะอยู่บนเซิร์ฟเวอร์ คุณจะต้องส่งออกข้อมูลไปยังไคลเอนต์ (เบราว์เซอร์) ก่อนจึงจะสามารถเข้าถึงได้ผ่าน Javascript / jQuery
devnull69

คำตอบ:


136

คุณสามารถลองใช้ 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

ฉันต้องการข้อมูลเข้ารหัสแบบเดียวกับที่ฉันดึงข้อมูลเมื่อฉันโพสต์ผ่านรูปแบบ html ด้วยประเภทการเข้ารหัส "multipart / form-data"
kschaeffler

164

องค์ประกอบไฟล์อินพุต:

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

รับไฟล์:

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

14
โซลูชั่นที่สมบูรณ์แบบ! ขอบคุณ. การปรับปรุงสำหรับการอัปโหลดครั้งเดียวดัชนี 0. var myFile = $ ('# fileinput'). prop ('files') [0];
polras

ยอดเยี่ยมทำให้สคริปต์ของฉันทำงานร่วมกับ Cloudinary ได้โดยไม่ต้องส่งแบบฟอร์ม ลากวางอัปโหลด :)
Andy

นั่นคือสิ่งที่ฉันต้องการ
Amete Blessed

ตอบโจทย์มาก !! จากนั้นคุณสามารถย้ายตัวแปรด้วย$('.myClass').prop('files', myFile );
always-a-learner

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


41

Html:

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

jQuery:

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

เราต้องการรับองค์ประกอบแรกเท่านั้นเนื่องจาก prop ('files') ส่งคืนอาร์เรย์


15

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 ฯลฯ )


10

FileReader API พร้อม jQuery ตัวอย่างง่ายๆ

( 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.