I have a file upload object on my page:
<input type=\"file\" ID=\"fileSelect\" />
with the following excel files on my desktop:
- file1.xlsx
- file1.xls
- file.csv
I want the file upload to ONLY show .xlsx
, .xls
, & .csv
files.
Using the accept
attribute, I found these content-types took care of .xlsx
& .xls
extensions...
accept
= application/vnd.openxmlformats-officedocument.spreadsheetml.sheet (.XLSX)
accept
= application/vnd.ms-excel (.XLS)
However, I cannot find the correct content-type for an Excel CSV file! Any suggestions?
EXAMPLE: http://jsfiddle.net/LzLcZ/
Well this is embarrassing... I found the solution I was looking for and it couldn\'t be simpler. I used the following code to get the desired result. Hope this helps someone in the future. Thanks everyone for your help.
<input id=\"fileSelect\" type=\"file\" accept=\".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\" />
Valid Accept Types:
For CSV files (.csv), use:
<input type=\"file\" accept=\".csv\" />
For Excel Files 97-2003 (.xls), use:
<input type=\"file\" accept=\"application/vnd.ms-excel\" />
For Excel Files 2007+ (.xlsx), use:
<input type=\"file\" accept=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" />
For Text Files (.txt) use:
<input type=\"file\" accept=\"text/plain\" />
For Image Files (.png/.jpg/etc), use:
<input type=\"file\" accept=\"image/*\" />
For HTML Files (.htm,.html), use:
<input type=\"file\" accept=\"text/html\" />
For Video Files (.avi, .mpg, .mpeg, .mp4), use:
<input type=\"file\" accept=\"video/*\" />
For Audio Files (.mp3, .wav, etc), use:
<input type=\"file\" accept=\"audio/*\" />
For PDF Files, use:
<input type=\"file\" accept=\".pdf\" />
DEMO:
http://jsfiddle.net/dirtyd77/LzLcZ/144/
NOTE:
If you are trying to display Excel CSV files (.csv
), do NOT use:
text/csv
application/csv
text/comma-separated-values
(works in Opera only).
If you are trying to display a particular file type (for example, a WAV
or PDF
), then this will almost always work...
<input type=\"file\" accept=\".FILETYPE\" />
These days you can just use the file extension
<input type=\"file\" ID=\"fileSelect\" accept=\".xlsx, .xls, .csv\"/>
Dom this attribute is very old and not accepted in modern browsers as far as I know, But here is an alternative to it, Try this
<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);\" />
I guess it\'ll help you of course you can change this script according to your needs.
I have used text/comma-separated-values
for CSV mime-type in accept attribute and it works fine in Opera. Tried text/csv
without luck.
Some others MIME-Types for CSV if the suggested do not work:
- text/comma-separated-values
- text/csv
- application/csv
- application/excel
- application/vnd.ms-excel
- application/vnd.msexcel
- text/anytext
Source: http://filext.com/file-extension/CSV
This didn\'t work for me under Safari 10:
<input type=\"file\" accept=\".csv\" />
I had to write this instead:
<input type=\"file\" accept=\"text/csv\" />
You can know the correct content-type for any file by just doing the following:
1) Select interested file,
2) And run in console this:
console.log($(\'.file-input\')[0].files[0].type);
You can also set attribute \"multiple\" for your input to check content-type for several files at a time and do next:
for (var i = 0; i < $(\'.file-input\')[0].files.length; i++){
console.log($(\'.file-input\')[0].files[i].type);
}
Attribute accept has some problems with multiple attribute and doesn\'t work correctly in this case.
I have modified the solution of @yogi. The addition is that when the file is of incorrect format I reset the input element value.
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;
}
I have custom verification buildin, because in open file window the user can still choose the options \"All files (\'*\')\", regardless if I explicitly set the accept attribute in input element.
Now you can use new html5 input validation attribute pattern=\".+\\.(xlsx|xls|csv)\"
.
using regex would be quicker
function checkIsExcel(file) {
if ((!/.*\\.xlsx$/.test(file.name)) && (!/.*\\.xls$/.test(file.name)) && (!/.*\\.csv$/.test(file.name))) {
return false;
}
return true;
}