วิธีเปิดไฟล์โลคัลดิสก์ด้วย JavaScript


155

ฉันพยายามเปิดไฟล์ด้วย

window.open("file:///D:/Hello.txt");

เบราว์เซอร์ไม่อนุญาตให้เปิดไฟล์ภายในเครื่องด้วยวิธีนี้อาจเป็นเพราะเหตุผลด้านความปลอดภัย ฉันต้องการใช้ข้อมูลของไฟล์ในฝั่งไคลเอ็นต์ ฉันจะอ่านไฟล์ในเครื่องใน JavaScript ได้อย่างไร?

คำตอบ:


238

นี่คือตัวอย่างการใช้FileReader:

function readSingleFile(e) {
  var file = e.target.files[0];
  if (!file) {
    return;
  }
  var reader = new FileReader();
  reader.onload = function(e) {
    var contents = e.target.result;
    displayContents(contents);
  };
  reader.readAsText(file);
}

function displayContents(contents) {
  var element = document.getElementById('file-content');
  element.textContent = contents;
}

document.getElementById('file-input')
  .addEventListener('change', readSingleFile, false);
<input type="file" id="file-input" />
<h3>Contents of the file:</h3>
<pre id="file-content"></pre>


รายละเอียด

http://dev.w3.org/2006/webapi/FileAPI/

ความเข้ากันได้ของเบราว์เซอร์

  • IE 10+
  • Firefox 3.6+
  • Chrome 13+
  • Safari 6.1+

http://caniuse.com/#feat=fileapi


1
เพียงหนึ่งวินาทีเมื่อฉันโหลดไฟล์สุดท้ายซ้ำเนื้อหาไม่เปลี่ยนแปลง (ฉันพูดเกี่ยวกับเนื้อหาเมื่อฉันแก้ไขข้อความไฟล์) คุณช่วยได้ไหม
Hydroper

1
@SamusHands ใช่คุณพูดถูกฉันสามารถทำซ้ำปัญหาใน Safari และ Chrome (ทำงานได้ดีใน Firefox) การตั้งค่าอินพุตให้nullกับแต่ละonClickเหตุการณ์ควรทำเคล็ดลับดูที่: stackoverflow.com/a/12102992/63011
Paolo Moretti

3
นี่เป็นตัวอย่างที่FileReaderดี แต่มีความคิดเห็นdisplayContentsข้างต้นโปรดทราบว่าการตั้งค่าinnerHTMLเช่นนี้กับเนื้อหาที่ไม่น่าเชื่อถืออาจเป็นช่องโหว่ด้านความปลอดภัย (หากต้องการดูสิ่งนี้ด้วยตัวคุณเองให้สร้างbad.txtสิ่งที่มีลักษณะคล้ายกับ<img src="/nonexistent" onerror="alert(1);">และดูว่าการแจ้งเตือนได้รับการดำเนินการ - อาจเป็นรหัสที่เป็นอันตรายมากกว่านี้)
ShreevatsaR

2
@ShreevatsaR เป็นจุดที่ดีจริงๆ ตัวอย่างของฉันเป็นเพียงตัวอย่าง แต่คุณพูดถูกมันไม่ควรส่งเสริมนิสัยด้านความปลอดภัยที่ไม่ดี ฉันแทนที่ด้วยinnerHTML textContentขอบคุณสำหรับความคิดเห็นของคุณ
เปาโล Moretti

1
@TeylerHalama คุณสามารถใช้DOMContentLoadedกิจกรรมนี้ได้
เปาโล Moretti

59

สิ่งอำนวยความสะดวก HTML5 FileReaderไม่ช่วยให้คุณสามารถประมวลผลไฟล์ท้องถิ่น แต่เหล่านี้จะต้องเลือกโดยผู้ใช้ที่คุณไม่สามารถไปรากเกี่ยวกับผู้ใช้ดิสก์มองหาไฟล์

ฉันใช้สิ่งนี้กับ Chrome รุ่นพัฒนา (6.x) ฉันไม่รู้ว่าเบราว์เซอร์อื่นรองรับอะไรบ้าง


3
ตอนนี้เป็นไปได้ด้วย HTML5 ดูที่นี่
Flavien Volken

1
การสแกนอย่างรวดเร็วของข้อมูลจำเพาะอ้างอิง (ปรับปรุงล่าสุด 2012-07-12) แสดงสิ่งอำนวยความสะดวกสำหรับการเขียนไฟล์ไม่เพียงอ่าน
HBP

26

เพราะฉันไม่มีชีวิตและฉันต้องการคะแนนชื่อเสียงทั้ง 4 ดังนั้นฉันสามารถแสดงความรักของฉันกับคนที่เก่งในการเขียนโค้ดฉันได้แบ่งปันการดัดแปลงรหัสPaolo Morettiของฉัน เพียงแค่ใช้ฟังก์ชั่นที่จะดำเนินการกับเนื้อหาของไฟล์เป็นพารามิเตอร์แรกopenFile()

function dispFile(contents) {
  document.getElementById('contents').innerHTML=contents
}
function clickElem(elem) {
	// Thx user1601638 on Stack Overflow (6/6/2018 - /programming/13405129/javascript-create-and-save-file )
	var eventMouse = document.createEvent("MouseEvents")
	eventMouse.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
	elem.dispatchEvent(eventMouse)
}
function openFile(func) {
	readFile = function(e) {
		var file = e.target.files[0];
		if (!file) {
			return;
		}
		var reader = new FileReader();
		reader.onload = function(e) {
			var contents = e.target.result;
			fileInput.func(contents)
			document.body.removeChild(fileInput)
		}
		reader.readAsText(file)
	}
	fileInput = document.createElement("input")
	fileInput.type='file'
	fileInput.style.display='none'
	fileInput.onchange=readFile
	fileInput.func=func
	document.body.appendChild(fileInput)
	clickElem(fileInput)
}
Click the button then choose a file to see its contents displayed below.
<button onclick="openFile(dispFile)">Open a file</button>
<pre id="contents"></pre>


2
ขอบคุณเป็นประโยชน์ แม้ว่าโปรดทราบว่าแทนที่จะเป็นรหัสที่คุณมีclickElem()คุณสามารถโทรfileInput.click()ได้ (อย่างน้อยใน Chrome เวอร์ชันล่าสุด)
Venryx

6

ลอง

function readFile(file) {
  return new Promise((resolve, reject) => {
    let fr = new FileReader();
    fr.onload = x=> resolve(fr.result);
    fr.readAsText(file);
})}

แต่ผู้ใช้จำเป็นต้องดำเนินการเพื่อเลือกไฟล์


ฉันเพิ่งเห็น msg.innerText และเป็นครั้งแรกที่ฉันได้เรียนรู้ว่าองค์ประกอบบางอย่างที่ระบุด้วย ID สามารถเข้าถึงได้โดยใช้ ID เป็นชื่อตัวแปรหรือคุณสมบัติของวัตถุหน้าต่าง
fmalina

ดังนั้นคำตอบคือเราไม่สามารถ html ดูเหมือนจะสมบูรณ์แบบมากสำหรับการโต้ตอบกับเอกสาร! แต่ทุกอย่างไม่สามารถให้บริการได้ เข้าถึงไฟล์ในท้องถิ่นจะได้รับดี
yota

@yota - เบราว์เซอร์บังคับให้ผู้ใช้โต้ตอบ (และระวัง) อาจเป็นเพราะเหตุผลด้านความปลอดภัย
Kamil Kiełczewski

-4

วิธีคำขอ xmlhttp ไม่ถูกต้องสำหรับไฟล์บนดิสก์ในเครื่องเนื่องจากความปลอดภัยของเบราว์เซอร์ไม่อนุญาตให้เราทำเช่นนั้น แต่เราสามารถแทนที่ความปลอดภัยของเบราว์เซอร์ได้โดยการสร้างทางลัด -> คลิกขวา -> คุณสมบัติในเป้าหมาย "... location path.exe "ผนวก - อนุญาตให้เข้าถึงไฟล์จากไฟล์นี่คือการทดสอบกับโครเมี่ยม แต่ควรระมัดระวังว่าหน้าต่างเบราว์เซอร์ทั้งหมดควรจะปิดและรหัสควรจะเรียกใช้จากเบราว์เซอร์ที่เปิดผ่านทางลัดนี้


-7

คุณทำไม่ได้ เบราว์เซอร์ใหม่ ๆ เช่น Firefox, Safari ฯลฯ ปิดกั้นโปรโตคอล 'ไฟล์' มันจะทำงานบนเบราว์เซอร์เก่าเท่านั้น

คุณจะต้องอัปโหลดไฟล์ที่คุณต้องการ


-9

โดยปกติแล้ว Javascript จะไม่สามารถเข้าถึงไฟล์ในเครื่องในเบราว์เซอร์ใหม่ แต่สามารถใช้วัตถุ XMLHttpRequest เพื่ออ่านไฟล์ได้ ดังนั้นจริงๆแล้ว Ajax (ไม่ใช่ Javascript) ซึ่งกำลังอ่านไฟล์

หากคุณต้องการอ่านไฟล์abc.txtคุณสามารถเขียนรหัสเป็น:

var txt = '';
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
  if(xmlhttp.status == 200 && xmlhttp.readyState == 4){
    txt = xmlhttp.responseText;
  }
};
xmlhttp.open("GET","abc.txt",true);
xmlhttp.send();

ตอนนี้txtมีเนื้อหาของไฟล์ abc.txt


61
Ajax คือ JavaScript
มัฟฟินแมน

4
@TheMuffinMan และ XML (Asynchronus Javascript และ XML)
Quintec

9
คำตอบนี้ไม่เกี่ยวข้องเนื่องจาก op ขอวิธีเปิดไฟล์ที่อยู่ในฝั่งไคลเอ็นต์ไม่ใช่ไฟล์ที่อยู่บนเซิร์ฟเวอร์
โทมัสเหงียน

4
@ThomasNguyen คำถามนี้เป็นผลลัพธ์ google แรกของ "javascript open file" และคำตอบนี้มีประโยชน์
Nathan Goings

@ThomasNguyen ฉันเห็นด้วย แต่วิธีแก้ปัญหาที่เป็นไปได้โดยไม่มี FileReader อาจเป็นการอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์และอ่านจากที่นั่น ฉันยังคงลงคะแนนคำตอบนี้
inf3rno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.