HTML Input =“ file” ยอมรับประเภทไฟล์คุณสมบัติ (CSV)


501

ฉันมีวัตถุอัพโหลดไฟล์ในหน้าของฉัน:

<input type="file" ID="fileSelect" />

ด้วยไฟล์ excel ต่อไปนี้บนเดสก์ท็อปของฉัน:

  1. file1.xlsx
  2. file1.xls
  3. file.csv

ฉันต้องการอัปโหลดไฟล์ไปเท่านั้นแสดง.xlsx, .xlsและ.csvไฟล์

เมื่อใช้แอacceptททริบิวต์ฉันพบว่าประเภทเนื้อหาเหล่านี้ดูแล.xlsx& .xlsส่วนขยาย ...

accept= application / vnd.openxmlformats-officedocument.spreadsheetml.sheet (.XLSX)

accept= application / vnd.ms-excel (.XLS)

อย่างไรก็ตามฉันไม่พบประเภทเนื้อหาที่ถูกต้องสำหรับไฟล์ Excel CSV! ข้อเสนอแนะใด ๆ

ตัวอย่าง: http://jsfiddle.net/LzLcZ/


เบราว์เซอร์ส่วนใหญ่ไม่เคารพคุณสมบัติการยอมรับเนื่องจากสามารถใช้เพื่อสนับสนุนผู้ใช้ที่ไม่สนใจส่งไฟล์ที่มีความละเอียดอ่อน
tletnes

9
@tletnes ไม่เป็นความจริงก็สนับสนุนโดยเบราว์เซอร์ที่สำคัญที่สุด
Dom

คุณสามารถลองทำสิ่งนี้ได้ถ้า ($ .trim ($ ('# OriginalFileName'). val ())! = "") {var ext = $ ('# OriginalFileName'). val (). split ('.') .pop () toLowerCase (). if ($ .inArray (ต่อ, ['doc', 'docx', 'pdf', 'xlsx', 'xls']) == -1) {$ ('# OriginalFileNameValid'). html ('ใช้. doc , .docx, .pdf ไฟล์ '); }}
Nithin Paul

ในกรณีที่ผู้ใช้งาน Ubuntu คนอื่นสับสนนี้ผมพบว่าใน Ubuntu, Firefox จะแสดง "All Files" เป็นค่าเริ่มต้น แต่เพิ่มสิ่งที่ "ยอมรับ" ของคุณในแอตทริบิวต์นั้นคือการเลือกประเภทไฟล์ในกล่องโต้ตอบเลือกไฟล์
mltsy

คำตอบ:


1246

นี่เป็นเรื่องน่าอาย ... ฉันพบวิธีแก้ปัญหาที่ฉันกำลังมองหาและมันก็ไม่ง่ายกว่านี้อีกแล้ว ฉันใช้รหัสต่อไปนี้เพื่อให้ได้ผลลัพธ์ที่ต้องการ หวังว่าสิ่งนี้จะช่วยให้ใครบางคนในอนาคต ขอบคุณทุกคนสำหรับความช่วยเหลือของคุณ

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

ประเภทการยอมรับที่ถูกต้อง:

สำหรับไฟล์ CSV (.csv) ให้ใช้:

<input type="file" accept=".csv" />

สำหรับไฟล์ Excel 97-2003 (.xls) ให้ใช้:

<input type="file" accept="application/vnd.ms-excel" />

สำหรับExcel Files 2007+ (.xlsx) ให้ใช้:

<input type="file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />

สำหรับไฟล์ข้อความ (.txt) ใช้:

<input type="file" accept="text/plain" />

สำหรับไฟล์รูปภาพ (.png / .jpg / etc) ให้ใช้:

<input type="file" accept="image/*" />

สำหรับไฟล์ HTML (.htm, .html) ให้ใช้:

<input type="file" accept="text/html" />

สำหรับไฟล์วิดีโอ (.avi, .mpg, .mpeg, .mp4) ให้ใช้:

<input type="file" accept="video/*" />

สำหรับไฟล์เสียง (.mp3, .wav ฯลฯ ) ให้ใช้:

<input type="file" accept="audio/*" />

สำหรับไฟล์ PDFให้ใช้:

<input type="file" accept=".pdf" /> 

DEMO:
http://jsfiddle.net/dirtyd77/LzLcZ/144/


บันทึก:

ถ้าคุณกำลังพยายามที่จะแสดงไฟล์ Excel CSV ( .csv) จะไม่ได้ใช้:

  • text/csv
  • application/csv
  • text/comma-separated-values( ใช้ได้กับ Opera เท่านั้น )

หากคุณพยายามที่จะแสดงไฟล์บางประเภท (เช่น a WAVหรือPDF) ไฟล์นี้จะใช้งานได้ ...

 <input type="file" accept=".FILETYPE" />

3
ดูเหมือนว่า Chrome จะรองรับคุณสมบัตินี้ แต่ Firefox ยังคงทำงานต่อไป คุณสามารถลงคะแนนข้อผิดพลาดนี้เพื่อพวกเขาจะแก้ปัญหาได้เร็วขึ้น: bugzilla.mozilla.org/show_bug.cgi?id=826176
Salvatorelab

3
@DavidRouten แอตทริบิวต์ accept เพียงแค่กรองประเภทไฟล์ คุณจะต้องใช้การตรวจสอบไฟล์เช่นกันเพื่อป้องกันผู้ใช้จากการเลือกไฟล์ประเภทอื่น หวังว่าจะช่วย!
Dom

1
<input type = "file" accept = ". csv" /> ใช้งานไม่ได้ใน Firefox มีวิธีแก้ไขปัญหาอื่นให้ทำตามนี้ใน Firefox หรือไม่
Ganesa Vijayakumar

1
<input type="file" accept=".csv, text/csv" />ทำงานให้ฉันใน firefox, chrome และ opera บน mac .csv เท่านั้นที่ไม่สามารถใช้งานได้ในเบราว์เซอร์ทั้งหมด
tmas

1
คุณสามารถเพิ่มตัวอย่างสำหรับไฟล์ "xml" ได้หรือไม่ มันจะเป็นประโยชน์ ขอบคุณล่วงหน้า.
ni8mr

161

วันนี้คุณสามารถใช้นามสกุลไฟล์

<input type="file" ID="fileSelect" accept=".xlsx, .xls, .csv"/>

3
แม้ว่าสิ่งนี้น่าประหลาดใจ (และทางเลือกapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel) ยังคงไม่ทำงานบน Edge 41.16299.820.0 stackoverflow.com/questions/31875617/… wpdev.uservoice.com/forums/257854-microsoft-edge-developer/ …
SharpC

38

Dom คุณลักษณะนี้เก่ามากและไม่ได้รับการยอมรับในเบราว์เซอร์ที่ทันสมัยเท่าที่ฉันรู้ แต่นี่เป็นทางเลือกที่จะลองนี้

<script type="text/javascript" language="javascript">
function checkfile(sender) {
    var validExts = new Array(".xlsx", ".xls", ".csv");
    var fileExt = sender.value;
    fileExt = fileExt.substring(fileExt.lastIndexOf('.'));
    if (validExts.indexOf(fileExt) < 0) {
      alert("Invalid file selected, valid files are of " +
               validExts.toString() + " types.");
      return false;
    }
    else return true;
}
</script>

<input type="file" id="file" onchange="checkfile(this);" />

ฉันเดาว่ามันจะช่วยคุณแน่นอนว่าคุณสามารถเปลี่ยนสคริปต์นี้ได้ตามความต้องการของคุณ


5
วิธีแก้ปัญหาที่ยอดเยี่ยม แต่ฉันไม่เข้าใจว่าทำไมแอตทริบิวต์ดังกล่าวจึงถูกพิจารณาว่าเป็น 'เก่า' นี่เป็นคุณสมบัติตัวเลือกไฟล์พื้นฐานในเกือบทุกระบบปฏิบัติการเบราว์เซอร์ควรพยายามอย่างเต็มที่เพื่อให้สามารถใช้งานได้และจะช่วยผู้ใช้จำนวนมาก ...
Christophe Roussy

1
ยอมรับแอตทริบิวต์ไม่เก่าและได้รับการสนับสนุนในเบราว์เซอร์หลักยกเว้นสำหรับ IE / ขอบ: caniuse.com/#feat=input-file-accept โปรดปรับปรุงคำตอบของคุณใหม่เพราะมันเข้าใจผิด
thomaux

2
คุณลักษณะที่สำคัญที่สุดของแอacceptททริบิวต์คือคำใบ้ที่มีให้ในกล่องโต้ตอบแบบเปิด ผู้ใช้ควรนำเสนอด้วยไฟล์ที่ตรงกันโดยค่าเริ่มต้นสันนิษฐานว่ามีตัวเลือกให้เลือกประเภทอื่น ๆ หากพวกเขาต้องการ - นี่คือสิ่งที่เบราว์เซอร์ที่ทันสมัยที่สุดทำงานในขณะนี้
Coderer

13

ฉันใช้text/comma-separated-valuesสำหรับประเภท mime แบบ CSV ในการยอมรับคุณสมบัติและทำงานได้ดีใน Opera พยายามอย่างtext/csvไร้โชค

ประเภท MIME อื่น ๆ สำหรับ CSV หากคำแนะนำไม่ทำงาน:

  • ข้อความ / คั่นด้วยเครื่องหมายจุลภาคค่า
  • ข้อความ / CSV
  • แอพลิเคชัน / CSV
  • แอพลิเคชัน / Excel
  • application / vnd.ms-Excel
  • แอพลิเคชัน / vnd.msexcel
  • ข้อความ / anytext

ที่มา: http://filext.com/file-extension/CSV


1
สวัสดี Dom! ฉันอยากจะบอกว่าเสียใจเพราะคำตอบของคุณ (ทำเครื่องหมายว่าถูกต้อง) ก็โอเคและฉันไม่ได้ให้ความสนใจกับมันมาก่อนเพราะฉันกำลังทดสอบเว็บไซต์ใน Opera เท่านั้น หลังจากทดสอบในเบราว์เซอร์อื่นฉันเห็นว่าคำตอบของคุณสมบูรณ์กว่า แต่มันไม่สามารถใช้ได้กับทุกเบราว์เซอร์ Firefox 17 ไม่รองรับการยอมรับวิธีการกรองใน File Dialog ( bugzilla.mozilla.org/show_bug.cgi?id=83749#c14 ) ดังนั้นคุณสมบัตินี้จึงน่าสงสัยสำหรับฉัน ฉันจะใช้การตรวจสอบความถูกต้องของไฟล์ javascript แต่ใช้ text / csv ในการรับ attr เพราะมันเป็นค่าเริ่มต้นของ IANA iana.org/assignments/media-types
jaysponsored

11

สิ่งนี้ใช้ไม่ได้กับฉันภายใต้ Safari 10:

<input type="file" accept=".csv" />

ฉันต้องเขียนสิ่งนี้แทน:

<input type="file" accept="text/csv" />

สวัสดี, มันทำงานได้ดีกับซาฟารีของฉันด้วย แต่ถ้าเราต้องการรับเอกสาร excel ล่ะ? คุณมีเงื่อนงำอะไรบ้าง @trojan
gustav

ตรวจสอบคำตอบของ Big Money TLDR; <input type = "file" ID = "fileSelect" accept = ". xlsx, .xls, .csv" />
Sk Irfan

4

คุณสามารถทราบชนิดเนื้อหาที่ถูกต้องสำหรับไฟล์ใด ๆ เพียงแค่ทำสิ่งต่อไปนี้:

1) เลือกไฟล์ที่สนใจ

2) และทำงานในคอนโซลนี้:

console.log($('.file-input')[0].files[0].type);

นอกจากนี้คุณยังสามารถตั้งค่าแอตทริบิวต์ "หลาย" สำหรับอินพุตของคุณเพื่อตรวจสอบประเภทเนื้อหาสำหรับไฟล์หลายไฟล์ในเวลาเดียวกันและทำต่อไป:

for (var i = 0; i < $('.file-input')[0].files.length; i++){
    console.log($('.file-input')[0].files[i].type);
}

ยอมรับคุณสมบัติมีปัญหาบางอย่างกับแอตทริบิวต์หลายรายการและทำงานไม่ถูกต้องในกรณีนี้


1

ฉันแก้ไขโซลูชันของ @yogi แล้ว นอกจากนี้คือเมื่อไฟล์อยู่ในรูปแบบที่ไม่ถูกต้องฉันรีเซ็ตค่าองค์ประกอบอินพุต

function checkFile(sender, validExts) {
    var fileExt = sender.value;
    fileExt = fileExt.substring(fileExt.lastIndexOf('.'));
    if (validExts.indexOf(fileExt) < 0 && fileExt != "") {
        alert("Invalid file selected, valid files are of " +
                 validExts.toString() + " types.");
        $(sender).val("");
        return false;
    }
    else return true;
}

ฉันมี buildin การตรวจสอบที่กำหนดเองเพราะในหน้าต่างเปิดไฟล์ผู้ใช้ยังคงสามารถเลือกตัวเลือก "ไฟล์ทั้งหมด ('*')" ไม่ว่าฉันจะตั้งค่าคุณสมบัติการยอมรับในองค์ประกอบอินพุตอย่างชัดเจน


0

ตอนนี้คุณสามารถใช้แอตทริบิวต์การตรวจสอบอินพุต html5 ใหม่pattern=".+\.(xlsx|xls|csv)"ได้แล้ว


10
ตามMDN , This attribute applies when the value of the type attribute is text, search, tel, url or email; otherwise it is ignored.เกี่ยวกับการป้อนข้อมูลไฟล์พวกเขาไปในที่จะบอกว่าfile: A control that lets the user select a file. Use the accept attribute to define the types of files that the control can select.
Dom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.