判断上传文件(单个)大小是否符合服务器设置:
(JS快速判断,而不是等二进制流读取完再返回错误信息。)
1.javaScript 客户端脚本判断,但是针对不同的浏览器,不同的权限设置,不一定能成功;(且于服务器端实际读取的文件大小精度有差异,难以靠以上传的流的大小来保证文件是否已经上传完毕)
1. 服务器即时判断:服务器读取流,直到读取的流的数量大于所设定大的限制,则返回错误信息。(占太多的时间,且浪费服务器资源)
2.服务器端判断:在发送POST请求时,信息头里面都包含 Content-Length 属性,其代表着整个请求的数据长度。我们可以通过简单的判断这个Header数据,发现超过了我们允许的长度则直接断开连接,这样就不会对服务器造成资源浪费。——还必须提交表单,通过request对象获取数据长度,不能通过ajax请求方式来获得待上传文件大小,因为ajax请求传参有URL和json方式,ajax采用post方式请求时只能使用MIMI编码类型为:application/x-www-form-urlencoded
如何判断批量上传的每一个文件的大小:
(使用方法二)
1. 在客户端判断文件大小,只提交服务器一个文件流,但是文件大小的精确程度会有一定程度的不同,导致一种假死现象;还会有客户端js代码的权限问题。
2. 在服务器端判断文件大小,但是服务器在真实读取文件流之前 ,使用上面的方法二,只能得到整个流的大小,不能得到,单个文件的大小;这样只能实现整个上传进度的统计。而不可能实现多个文件分开计算其精度的方法;
3.每个文件提交一个文件流,服务器对每个流处理时返回文件大小及文件进度。方法是,每个 <input type=”file”> 标签都置于一个独立的form表单中,然后一次提交;
服务器如何在真正文件上传(读取流)之前获得文件名?
按照正常的Http上传文件的方式是不能实现的,只有在客户端向服务器提交表单之前先向服务器提交一个Ajax请求,然后服务器调用Ajax请求传递过来 的参数(文件名)来判断是否符合服务器提交要求,如果符合则在客户端的回调函数中提交本文件所属的form表单;如果不符合则返回出错信息;
如果文件不合法,服务器、客户端如何而实现:
(此时服务器已经必定在读http传递过来的文件流,除非判断文件名是在客户端判断,或者是使用Ajax在服务器端判断的方法)
1、 客户端使用Ajax 接受服务器返回出错信息,并在服务器内部读取流文件时,如果发现文件不合法则抛出特定的异常,并在服务器内部自行捕获处理;
2、 流覆盖;
客户端从服务器读取文件上传进度信息:(Ajax)
几个重要的步骤:
1、 构建Ajax 对象,设置回调函数 onreadystatechange;
2、 设置携带特定参数信息的URL;发送请求;
3、 等待回调;
需要注意的问题:
1、 IE缓存问题;
解决方法:清除由于IE缓存造成的Ajax不能多次发出请求:
1.服务器端:
response.setHeader(“Cache-Control”,”no-cache”);
1.客户端
在Ajax发出的请求URL后添加一个随机数(Math.random()),这样对于IE来说每次请求的页面都不是同一个页面就不会造成直接调用缓存页面的问题;
2、 同步还是异步请求的问题;
Ajax的优势就是可以异步发送请求到服务器,而不需要服务器实时的去相应,所以设为异步;
服务器端响应Ajax请求的几个问题:
1、 Ajax异步请求与传统请求在服务器端的判断方法;
1.request.getHeader("x-requested-with");
b.在URL后添加一个与服务器端约定好的参数;
(在服务器端都必须显示的去判断)
2、 字符编码问题;
Ajax请求默认的参数默认均为 ”ISO8859-1”,在服务器端必须要进行解码;
UI上传组件应该具备以下基本功能:
1. 能让用户提供一个上传路径
2. 能够限制上载文件的大小(防止上传文件过大)
3. 能够支持多个文件同时上传及限制并行上传文件的个数(多文件并行上传)
4. 可以在服务器端进行异常错误捕获,并进行适当的处理
5. 上传组件的稳定性(上传速度能够保持稳定)
6. 可以设定屏蔽(或指定)固定类型的文件(如以 .exe结尾的文件等)
7. 能够向用户提供一个友好的交互界面,实时显示该文件上传的进度、当前用户的网络状态、上传此文件已花费时间、传输速率,剩余时间等信息
8. 支持对已上传或正在上传文件的删除
9. 用户使用及操作及可扩展 ,并能够灵活的集成到其它项目中
Ajax的同步问题 ;(两个不同的页面同时访问一个服务端URL,导致两者得到的值竟然是后者的值)
一个页面的,多表单提交的问题解决方案:
1. 使用Ajax 实现。
2. 使用 form 的target 属性提交到一个本页面的iframe 的name 上,那样页面就不会跳转。
参考: