文件上传:<input type="file" /> (IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持。)

1、允许上传文件数量

允许选择多个文件:<input type="file" multiple>
只允许上传一个文件:<input  type="file" single>

2、上传指定的文件格式

<input type="file" accept="image/gif,image/png" />

这里的上传格式仅指打开上传弹窗选择文件时默认的文件格式,可手动修改成其它文件格式。

如果不限制上传图片的格式可写成:accept="image/*"

其它格式参考如下:

*.3gpp   audio/3gpp, video/3gpp    3GPP Audio/Video
*.ac3    audio/ac3    AC3 Audio
*.asf    allpication/vnd.ms-asf    Advanced Streaming Format
*.au     audio/basic    AU Audio
*.css    text/css    Cascading Style Sheets
*.csv    text/csv    Comma Separated Values
*.doc    application/msword    MS Word Document
*.dot    application/msword    MS Word Template
*.dtd    application/xml-dtd    Document Type Definition
*.dwg    image/vnd.dwg    AutoCAD Drawing Database
*.dxf    image/vnd.dxf    AutoCAD Drawing Interchange Format
*.gif    image/gif    Graphic Interchange Format
*.htm    text/html    HyperText Markup Language
*.html   text/html    HyperText Markup Language
*.jp2    image/jp2    JPEG-2000
*.jpe    image/jpeg    JPEG
*.jpeg   image/jpeg    JPEG
*.jpg    image/jpeg    JPEG
*.js     text/javascript, application/javascript    JavaScript
*.json   application/json    JavaScript Object Notation
*.mp2    audio/mpeg, video/mpeg    MPEG Audio/Video Stream, Layer II
*.mp3    audio/mpeg    MPEG Audio Stream, Layer III
*.mp4    audio/mp4, video/mp4    MPEG-4 Audio/Video
*.mpeg   video/mpeg    MPEG Video Stream, Layer II
*.mpg    video/mpeg    MPEG Video Stream, Layer II
*.mpp    application/vnd.ms-project    MS Project Project
*.ogg    application/ogg, audio/ogg    Ogg Vorbis
*.pdf    application/pdf    Portable Document Format
*.png    image/png    Portable Network Graphics
*.pot    application/vnd.ms-powerpoint    MS PowerPoint Template
*.pps    application/vnd.ms-powerpoint    MS PowerPoint Slideshow
*.ppt    application/vnd.ms-powerpoint    MS PowerPoint Presentation
*.rtf    application/rtf, text/rtf    Rich Text Format
*.svf    image/vnd.svf    Simple Vector Format
*.tif    image/tiff    Tagged Image Format File
*.tiff   image/tiff    Tagged Image Format File
*.txt    text/plain    Plain Text
*.wdb    application/vnd.ms-works    MS Works Database
*.wps    application/vnd.ms-works    Works Text Document
*.xhtml  application/xhtml+xml    Extensible HyperText Markup Language
*.xlc    application/vnd.ms-excel    MS Excel Chart
*.xlm    application/vnd.ms-excel    MS Excel Macro
*.xls    application/vnd.ms-excel    MS Excel Spreadsheet
*.xlt    application/vnd.ms-excel    MS Excel Template
*.xlw    application/vnd.ms-excel    MS Excel Workspace
*.xml    text/xml, application/xml    Extensible Markup Language
*.zip    aplication/zip    Compressed Archive

 3、FileList上传文件数组

FileList对象都是一组文件对象的集合,而文件对象则拥有下列的属性:
name – 文件名(不包含路径)
type – 文件的MIME类型(小写)
size – 文件的尺寸(单位为字节)

lastModifiedDate 为上传文件的最后修改时间

通过上面的几个对象,我们能够控制用户上传的文件大小和文件类型,以便减轻服务器再次检测时的压力,并提升安全系数

var a=document.getElementById("file");
a.οnchange=function(e){e=e || window.event;var b=e.target.files;alert(b[0].name);
}

4、拖动上传
dataTransfer 对象
dropEffect[=sCursorStyle]
设置或获取拖拽操作的类型和要显示的光标类型
copy:复制样式被显示
link:链接样式被显示
move:移动样式被显示
none:默认,没有鼠标样式被定义

effectAllowed[=sEffect]
设置或获取数据传送操作可应用与该对象的源元素
copy 选项被复制
link  选项被dataTransfer作为link方式保存
move  当放置时,对象被移动至目标对象
copylink  选项是被复制还是被作为link方式保存关键在于目标对象
linkmove 选项是被作为link方式保存还是被移动关键在于目标对象
all 所有效果都被支持
none 不支持任何效果
uninitialized 默认不能通过这个属性传递任何值

setData(sFormat,sData)     将指定格式的数据赋值给dataTransfer或者clipboardData     sFormat:URL,Text
getData(sFormat)     从dataTransfer或者clipboardData中获取值     sFormat:URL,Text
clearData([sFormat])     通过dataTransfer或者clipboardData中删除某种格式的数据     sFormat:Text,URL,File,HTML,Image

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
#DropZone{border:1px solid #CCC;height:50px;}
</style>
</head>
<body>
<input type="file" multiple accept="image/gif,image/png" id="file">
<div id="DropZone"></div>
<div id="Lists"></div>
<script>
var aa=document.getElementById("file");
aa.οnchange=function(){fileDrop();
}function fileDrop(e) {e = e || window.event;e.stopPropagation(); // 阻止冒泡e.preventDefault();  //阻止默认行为var files = e.dataTransfer.files;   //FileListvar output = [];for(var i = 0, f; f = files[i]; i++) {output.push('<li><strong>' + f.name + '</strong>(' + f.type + ') - ' + f.size +' bytes</li>');}document.getElementById('Lists').innerHTML = '<ul>' + output.join('') + '</ul>';
};function dragOver(e) {e = e || window.event;e.stopPropagation();e.preventDefault();e.dataTransfer.dropEffect = 'copy'; //指定拖放视觉效果
};
var d = document.getElementById('DropZone');try {d.addEventListener('dragover', dragOver, false);d.addEventListener('drop', fileDrop, false)
} catch(ex) {document.write('something must be wrong!');
}</script>
</body>
</html>

5、FileReader文件预览,读取文件数据(同时可读取图片文件宽高)
FileReader包含四种异步读取文件的方式:
FileReader.readAsBinaryString(Blob|File) - result属性包含的是file/blob的二进制字符串形式的数据。每个字节由一个0-255的整数表示。
FileReader.readAsText(Blob|File, opt_encoding) - result属性包含的是以文本方式表示的file/blob数据。默认情况下,字符串以'UTF-8'编码方式解码。使用opt_encoding参数可以指定一个不同的格式。
FileReader.readAsDataURL(Blob|File) - result属性包含的是以data URL编码的file/blob数据。
FileReader.readAsArrayBuffer(Blob|File) - result属性包含的是以ArrayBuffer对象表示的file/blob数据。
一旦这些read方法被调用,onloadstart, onprogress, onload, onabort, onerror, onloadend就可以被用来追踪进度。

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
body{margin:0;padding:0;}
img{vertical-align:bottom;}
</style>
</head>
<body>
<input type="file" multiple accept="image/gif,image/png,,image/jpeg" id="Files">
<div id="Preview"></div>
<ul id="Errors"></ul>
<script>
function fileSelect(e) {e = e || window.event;var files = e.target.files;  //FileList Objects    var ireg = /image\/.*/i,p = document.getElementById('Preview');var ul = document.getElementById('Errors');for(var i = 0, f; f = files[i]; i++) {if(!f.type.match(ireg)) {//设置错误信息var li = document.createElement('li');li.innerHTML = '<li>' + f.name +'不是图片文件.</li>';ul.appendChild(li);continue;}var reader = new FileReader();reader.onload = (function(file) {return function(e) {var span = document.createElement('span');var img = new Image;img.alt=file.name;img.onload = function() {console.log(img.height); // image is loaded; sizes are available};img.src=this.result;span.innerHTML = '<img class="thumb" src="'+ this.result +'" alt="'+ file.name +'" />';p.insertBefore(span, null);};})(f);//读取文件内容reader.readAsDataURL(f);}
}if(window.File && window.FileList && window.FileReader && window.Blob) {document.getElementById('Files').addEventListener('change', fileSelect, false);
} else {document.write('您的浏览器不支持File Api');
}
</script>
</body>
</html>

上传txt文件内容预览(需对<>&'"|等符号进行过滤否则会中断读取):

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
body{margin:0;padding:0;}
img{vertical-align:bottom;}
</style>
</head>
<body>
<input type="file" multiple id="Files">
<div id="Preview"></div>
<ul id="Errors"></ul>
<script>
function encodeHTML(source) {  //return source;return source  .replace(/&/g, '&')  .replace(/</g, '<')  .replace(/>/g, '>').replace(/\"/g, '"');
};
function fileSelect(e) {  e = e || window.event;  var files = e.target.files;  //FileList Objects      var ireg = /text\/.*/i,  p = document.getElementById('Preview');  var ul = document.getElementById('Errors');  for(var i = 0, f; f = files[i]; i++) {  console.log(f.type);  if(!f.type.match(ireg)) {  //设置错误信息  var li = document.createElement('li');  li.innerHTML = '<li>' + f.name +'不是文本文件.</li>';  ul.appendChild(li);  continue;  }  var reader = new FileReader();  reader.onload = (function(file) {  return function(e) {  var div = document.createElement('div');  div.className = "text"  div.innerHTML = encodeHTML(this.result);  p.insertBefore(div, null);  };  })(f);  //读取文件内容  reader.readAsText(f);  }
}  if(window.File && window.FileList && window.FileReader && window.Blob) {  document.getElementById('Files').addEventListener('change', fileSelect, false);
} else {  document.write('您的浏览器不支持File Api');
}
</script>
</body>
</html>

读取上传txt指定区域文本内容:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
body{margin:0;padding:0;}
img{vertical-align:bottom;}
</style>
</head>
<body>
<input type="file" multiple id="Files">
<button type="button" id="buttons" data-start="0" data-end="3">确定</button>
<div id="range"></div>
<div id="content"></div>
<script>function readBlob(start, end) {  var files = document.getElementById('Files').files;  if(!files.length) {  alert('请选择文件');  return false;  }  var file = files[0],  start = parseInt(start, 10) || 0,  end = parseInt(end, 10) || (file.size - 1);  var r = document.getElementById('range'),  c = document.getElementById('content');  var reader = new FileReader();  reader.onloadend = function(e) {  if(this.readyState == FileReader.DONE) {  c.textContent = this.result;  r.textContent = "Read bytes: " + (start + 1) + " - " + (end + 1) + " of " + file.size + " bytes";  }  };  var blob;  blob = file.slice(start, end + 1, 'text/plain;charset=UTF-8');  reader.readAsBinaryString(blob);
};  try {  document.getElementById('buttons').addEventListener('click', function(e) {  if(e.target.tagName.toLowerCase() == 'button') {  var start = e.target.getAttribute('data-start'),  end = e.target.getAttribute('data-end');  readBlob(start, end);  }    });
} catch(ex) {  alert('something error happens!')
}
</script>
</body>
</html>

File接口提供了slice方法支持把文件切成不同的片段,第一个参数是起始的字节数,第二个参数是结束的字节数,还有一个可选的内容类型字符串可以作为第三个参数。早期的chrome和firefox版本不支持file.slice   可使用file.webkitSlice和file.mozSlice替代,最新版本均支持file.slice。

6、文件读取进度 
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form>  <fieldset>  <legend>分度读取文件:</legend>  <input type="file" id="File" />  <input type="button" value="中断" id="Abort" />  <p>  <label>读取进度:</label><progress id="Progress" value="0" max="100"></progress>  </p>  <p id="Status"></p>  </fieldset>
</form>  <script>
var h = {  init: function() {  var me = this;  document.getElementById('File').onchange = me.fileHandler;  document.getElementById('Abort').onclick = me.abortHandler;  me.status = document.getElementById('Status');  me.progress = document.getElementById('Progress');  me.percent = document.getElementById('Percent');  me.loaded = 0;  //每次读取1M  me.step = 1024 * 1024;  me.times = 0;  },  fileHandler: function(e) {  var me = h;  var file = me.file = this.files[0];  var reader = me.reader = new FileReader();  //  me.total = file.size;  reader.onloadstart = me.onLoadStart;  reader.onprogress = me.onProgress;  reader.onabort = me.onAbort;  reader.onerror = me.onerror;  reader.onload = me.onLoad;  reader.onloadend = me.onLoadEnd;  //读取第一块  me.readBlob(file, 0);},  onLoadStart: function() {  var me = h;  },  onProgress: function(e) {  var me = h;  me.loaded += e.loaded;  //更新进度条  me.progress.value = (me.loaded / me.total) * 100;  },  onAbort: function() {  var me = h;  },  onError: function() {  var me = h;  },  onLoad: function() {  var me = h;  if(me.loaded < me.total) {  me.readBlob(me.loaded);  } else {  me.loaded = me.total;  }  },  onLoadEnd: function() {  var me = h;  },  readBlob: function(start) {  var me = h;  var blob,  file = me.file;  me.times += 1;  if(file.slice) {  blob = file.slice(start, start + me.step + 1);  } else if(file.mozSlice) {  blob = file.mozSlice(start, start + me.step + 1);  }  me.reader.readAsText(blob);  },  abortHandler: function() {  var me = h;  if(me.reader) {  me.reader.abort();  }  }
};  h.init();
</script>
</body>
</html>

本文代码以chrome测试为主。

参考资料:

http://blog.csdn.net/zhu1988renhui/article/details/7936498

http://blog.csdn.net/zhu1988renhui/article/details/7936525

http://dev.w3.org/2006/webapi/FileAPI/#dfn-filereader

http://www.html5rocks.com/zh/tutorials/file/dndfiles/

http://www.w3.org/TR/file-upload/

http://www.w3.org/TR/file-upload/#dfn-filereader

http://www.w3.org/TR/file-upload/#dfn-Blob

http://www.w3.org/TR/file-upload/#dfn-fileerror

http://www.w3.org/TR/progress-events/#Progress

http://www.zhangxinxu.com/wordpress/?p=1923

http://www.tfan.org/wp-content/slides/file.html#1

转载于:https://www.cnblogs.com/chenyablog/p/9957009.html

文件上传常见问题整理相关推荐

  1. CTF中文件上传题目整理总结

    0X00说在前面的话 CTF中或多或少都有点文件上传的题目,而这个又是最好整理的,变化的方式不是很多(至少到目前为止我没有发现太多的姿势....),随意就先整理这个吧. 0x01文件上传绕过的主要姿势 ...

  2. web安全入门(第七章-1)文件上传漏洞--解析、验证、伪造

    一.客户端检测 1,客户端校验:一般是在网页上写一段Js脚本,用Js去检测,校验上传文件的后缀名,有白名单也有黑名单. 2,判断方式:通过抓包来判断,如果还未抓住包,就弹出不准上传,那么就是前端验证, ...

  3. Bootstrap FileInput(文件上传)中文API整理

    下载地址.API和DOM地址(英语好的小伙伴可以看看) 下载地址:https://github.com/kartik-v/bootstrap-fileinput API文档 :http://plugi ...

  4. H5文件上传测试点,整理一波。

    需求背景:为了方便用户上传自己手机内的本地视频,同时提高视频的分发量,故支持在移动端H5页面增加上传视频的功能. 原型图: 1.首页&上传素材空页面:     2.上传素材(有素材)& ...

  5. 文件上传绕过姿势整理

    文件上传绕过姿势整理 WAF绕过 安全狗绕过 1.绕过思路:对文件的内容,数据.数据包进行处理. 关键点在这里Content-Disposition: form-data; name="fi ...

  6. weblogic系列漏洞整理————8、WebLogic 两处任意文件上传漏洞动态分析(CVE-2018-2894)

    0x01 前言 CNCERT前几天发公告称发现Oracle公司出品的基于JavaEE结构的中间件WebLogic产品存在一个远程上传漏洞,并得到了厂商的确认,危害程度评分高达9.8分.鉴于厂商已进行了 ...

  7. 文件上传下载 Content-type 设置整理

    一.Content-type基本概念 HTTP协议提供了Content-Type实体首部字段来描述报文实体的媒体格式,说明请求或返回的消息是用什么格式进行编码的,在request header和res ...

  8. 【狂神说】JavaWeb笔记整理 | SMBMS项目 | 文件上传和邮件发送

    目录 JavaWeb 1.基本概念 1.1 概念 1.2 web应用程序: 1.3 静态web 1.4 动态web 2.web服务器 2.1 技术讲解 2.2 web 服务器 3. Tomcat 3. ...

  9. 使用WinHttp接口实现HTTP协议Get、Post和文件上传功能

    我实现了一个最新版本的接口,详见<实现HTTP协议Get.Post和文件上传功能--使用WinHttp接口实现>.还有基于libcurl实现的版本<实现HTTP协议Get.Post和 ...

最新文章

  1. 神经网络neural network简单理解
  2. android文件导出错误—— failed to pull a selection
  3. Redis --数据类型 [1]
  4. python爬虫之 ---------------- 正则表达式(1)
  5. 听说有人快收权限掉了
  6. python字符串转义表
  7. SQL Server插入geography、geometry和c_hierarchyid类型数据
  8. selenium添加cookie切换到不同环境
  9. 洛谷 1449——后缀表达式(线性数据结构)
  10. 第四篇 SpringBoot 2 x整合MyBatis
  11. 论文索引平台EI,SCI
  12. Liferay 加载自定义css 文件
  13. python训练手势分类器_从Scikit Learn中保存的训练分类器进行预测
  14. MATLAB图像处理(均值滤波)
  15. 自己使用的jquery公用common.js
  16. k8s节点NotReady状态
  17. Apache Spark RDD 论文(中文翻译)
  18. 长短期记忆人工神经网络(LSTM)及其tensorflow代码应用
  19. IsEmpty 函数
  20. 共享汽车死亡前仆后继,巨头们要排队共赴黄泉?

热门文章

  1. 2022.4.8学习总结
  2. iOS开发 -- 蓝牙版本
  3. css 圆形背景icon_css3画实心圆和圆角的方法
  4. MathType更改公式大小
  5. 听说现在流行理财产品?
  6. 生产企业如何利用OA系统实现交接班无缝对接
  7. vue修改meta值_vue中动态设置meta标签和title标签的方法
  8. 计算机word插图教案,《在WORD文档中插入图片》教学设计
  9. cortex系列处理器排行_ARM Cortex各系列处理器分类比较
  10. 听说算法工程师80%的时间都在做特征工程?