上传文件的几种主要方法。

第一种:经典的form和input上传。 设置form的aciton为后端页面,enctype=“multipart/form-data”,type=‘post’

<form action='uploadFile.php' enctype="multipart/form-data" type='post'><input type='file'><input type='hidden' name='userid'><input type='hidden' name='signature'><button>提交</button>
</form>

使用input选择文件,设置好其他input的值,点击提交,将文件数据及签名等认证信息发送到form设置的action对应的页面,浏览器也会跳转到该页面。触发form表单提交数据的方式有2种,一种是在页面上点击button按钮或按钮触发,第二种是在js中执行form.submit()方法。

优点:使用简单方便,兼容性好,基本所有浏览器都支持。

缺点:

  1. 提交数据后页面会跳转(下面会讲如何禁止页面跳转)。
  2. 因为是浏览器发起的请求,不是一个ajax,所以前端无法知道什么时候上传结束。
  3. form表单里发送除文件外的数据,一般是新建一个type=hidden的input,value=‘需要传的数据’,每发送一个数据就需要一个input,一旦多了就会使得dom看起来比较冗余。

小技巧:

form表单提交数据后会自动跳转到action指定的页面,为了禁止页面跳转,可以在页面中新建一个空的ifame,比如name=‘upload’,然后设置form的target=“Uploader”,form有一个target的属性,规定在何处打开action,这样form提交数据后就会仍停留在当前页。代码如下:

<form action='uploadFile.php' enctype="multipart/form-data" type='post'  target="uploader1">
<input type='file'>
<button>提交</button>
</form>
<ifrmae name='upload' id='uploader1'></iframe>

这样写的另一个好处是,可以知道什么时候上传完成并接收到后端的回调结果。比如上面这个例子,文件数据发送到了 ‘uploadFile.php’,假设该页面处理完数据后返回了一个地址,该地址会被写入到之前的iframe中。所以在ifame的onload函数触发时,也就是上传完成后,可以在iframe中读取到后端返回的数据。

var  iframe = document.getElementById('upload1');
iframe.onload = function () {  var doc = window.frames['uploader1'].document;var pre = doc.getElementsByTagName('pre');var obj = JSON.parse(pre[0].innerHTML);}

使用这种方法时需要注意,iframe有跨域限制,创建出来的iframe的地址如果和当前页面地址不同源,会报错。这种情况下,建议大家在iframe的onload函数中,再次向后端请求一个接口获取文件地址,而不是直接去iframe里读取。或者返回这样的数据。

<script type="text/javascript">
window.top.window[callback](data)
</script>

callback是和前端约定好的名字,上传完成后触发该函数并返回后端数据。

第二种:使用formData上传。

用js构造form表单的数据,简单高效,但最低只兼容IE10,所以需要兼容IE9的童鞋们就略过这个方法吧。

html:

<input type='file'>

js:

var formData = new FormData();
formData.append("userid", userid);
formData.append("signature", signature);
formData.append("file", file); //file是blob数据
//再用ajax发送formData到服务器即可,注意一定要是post方式上传

说明:第一种方法提到了创建多个type=‘hidden’的input来发送签名数据,这儿可以用formData.append方法来代替该操作,避免了dom中有多个input的情况出现。最后将file数据也append到formData发送到服务器即可完成上传。

优点:由于这种方式是ajax上传,可以准确知道什么时候上传完成,也可以方便地接收到回调数据。

缺点:兼容性差

第三种:使用fileReader读取文件数据进行上传。
HTML5的新api,兼容性也不是特别好,只兼容到了IE10。

var fr = new FileReader();fr.readAsDataURL(file);fr.onload = function (event) {var data= event.target.result; //此处获得的data是base64格式的数据img.src = data;ajax(url,{data} ,function(){})
}

上面获得的data可以用来实现图片上传前的本地预览,也可以用来发送base64数据给后端然后返回该数据块对应的地址。

优点: 同第二种

缺点:一次性发送大量的base64数据会导致浏览器卡顿,服务器端接收这样的数据可能也会出现问题。

上传文件的几种主要方法。相关推荐

  1. ASP.NET上传文件的三种基本方法

    ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. Test.aspx关 ...

  2. django文件上传到服务器,django上传文件的三种方式

    Django文件上传需要考虑的重要事项 文件或图片一般通过表单进行.用户在前端点击文件上传,然后以POST方式将数据和文件提交到服务器.服务器在接收到POST请求后需要将其存储在服务器上的某个地方.D ...

  3. java fileupload 进度_Java上传文件进度条的实现方法(附demo源码下载)

    本文实例讲述了Java上传文件进度条的实现方法.分享给大家供大家参考,具体如下: 东西很简单,主要用到commons-fileupload,其中有一个progressListener的接口,该接口可以 ...

  4. java保存图片进度条_Java上传文件进度条的实现方法(附demo源码下载)

    本文实例讲述了Java上传文件进度条的实现方法.分享给大家供大家参考,具体如下: 东西很简单,主要用到commons-fileupload,其中有一个progressListener的接口,该接口可以 ...

  5. php获取上传文件路径 fakepath,JavaScript_js获取上传文件的绝对路径实现方法,在html中input type=file - phpStudy...

    js获取上传文件的绝对路径实现方法 在html中 function upload() { var filename = document.getElementById("importFile ...

  6. PHP实现上传文件并存进数据库的方法

    本文实例讲述了PHP实现上传文件并存进数据库的方法.分享给大家供大家参考.具体如下: show_add.php文件如下: <?php if(!isset($_REQUEST[''id'']) o ...

  7. django + python上传文件的两种方式

    突然心血来潮,研究了下django+python上传文件的两种方式. 第一:直接采用文件读写的方式上传 1. settings.py文件中设置文件的存放路径和文件读取路径 MEDIA_ROOT = o ...

  8. 用JSP实现上传文件的两种方法

    在用Java开发企业器系统的使用,特别是涉及到与办公相关的软件开发的时候,文件的上传是客户经常要提到的要求.因此有 一套很好文件上传的解决办法也能方便大家在这一块的开发. 首先申明,该文章是为了自己记 ...

  9. linux禁止客户端上传文件_Linux 几种上传文件到linux服务的方法

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...

最新文章

  1. PAT(甲级)2018年秋季考试 7-1 Werewolf - Simple Version
  2. olr 性能调优 NO_NORMS
  3. CF755G PolandBall and Many Other Balls(多项式/倍增fft)
  4. MyEclipse的Debug模式启动缓慢
  5. AngularJS复习小结
  6. k8s核心技术-Controller(statefulSet)_部署有状态应用---K8S_Google工作笔记0033
  7. 再谈互斥锁与条件变量!(终于搞清楚了啊!!!!!)
  8. Json 与 JS对象的关系与转换
  9. 你是否也陷入了《能力陷阱》?
  10. C++之常用集合(总结)
  11. 计算机开机按f1,图文讲解开机按f1的解决方法,简单明了!
  12. 数据库系统概论第五版第二章习题6(SPJ数据库查询操作)
  13. Scratch软件编程等级考试二级——20210626
  14. 如何验证白光干涉仪精度丨科普篇
  15. Java经典面试题汇总(五)网络编程
  16. 转子豪兄 树莓派上安装OpenCV
  17. 树形DP入门(二叉苹果树+没有上司的舞会)
  18. java日期时间详解
  19. Android OpenGL ES 渲染文本
  20. webpy使用笔记(二) session的使用

热门文章

  1. C++ 很难找工作了???
  2. 【修复】Word“文件发生错误”,无法保存文件
  3. MathType如何正确卸载?
  4. 代码的侵入式和非侵入式是什么意思
  5. 洛克菲勒家族是如何发家的,我们都看看
  6. 2022-2028年全球与中国汽车超声波传感器行业深度分析
  7. docker命令--k8s的日志
  8. 关于系统升级将暂停人爱官网、人爱数字化平台、人爱软件平台的通知
  9. java中几种常用的对象类型(po,vo,bo,dto)
  10. ubuntu 12.10起用g++4.7 编译C++11