求JavaScript文件夹上传解决方案
发布网友
发布时间:2022-04-23 20:39
我来回答
共1个回答
热心网友
时间:2022-04-15 08:26
所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。
二、Range
用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:
Range:用于客户端到服务端的请求,可以通过改字段指定下载文件的某一段大小及其单位,字节偏移从0开始。典型格式:
Ranges: (unit=first byte pos)-[last byte pos]
Ranges: bytes=4000- 下载从第4000字节开始到文件结束部分
Ranges: bytes=0~N 下载第0-N字节范围的内容
Ranges: bytes=M-N 下载第M-N字节范围的内容
Ranges: bytes=-N 下载最后N字节内容
1.以下几点需要注意:
(1)这个数据区间是个闭合区间,起始值是0,所以“Range: bytes=0-1”这样一个请求实际上是在请求开头的2个字节。
(2)“Range: bytes=-200”,它不是表示请求文件开始位置的201个字节,而是表示要请求文件结尾处的200个字节。
(3)如果last byte pos小于first byte pos,那么这个Range请求就是无效请求,server需要忽略这个Range请求,然后回应一个200,把整个文件发给client。
(4)如果last byte pos大于等于文件长度,那么这个Range请求被认为是不能满足的,server需要回应一个416,Requested range not satisfiable。
2.示例解释:
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
三、Content-Range
用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
四、Header示例
请求下载整个文件:
GET /test.rar HTTP/1.1
Connection: close
Host: 116.1.219.219
Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头
一般正常回应
HTTP/1.1 200 OK
Content-Length: 801
Content-Type: application/octet-stream
Content-Range: bytes 0-800/801 //801:文件总大小
一个最简单的断点续传实现大概如下:
1.客户端下载一个1024K的文件,已经下载了其中512K
2. 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:
Range:bytes=512000-
这个头通知服务端从文件的512K位置开始传输文件
3. 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加:
Content-Range:bytes 512000-/1024000
并且此时服务端返回的HTTP状态码应该是206,而不是200。
但是在实际场景中,会出现一种情况,即在终端发起续传请求时,URL对应的文件内容在服务端已经发生变化,此时续传的数据肯定是错误的。如何解决这个问题了?显然此时我们需要有一个标识文件唯一性的方法。在RFC2616中也有相应的定义,比如实现Last-Modified来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。同时RFC2616中还定义有一个ETag的头,可以使用ETag头来放置文件的唯一标识,比如文件的MD5值。
终端在发起续传请求时应该在HTTP头中申明If-Match 或者If-Modified-Since 字段,帮助服务端判别文件变化。
另外RFC2616中同时定义有一个If-Range头,终端如果在续传是使用If-Range。If-Range中的内容可以为最初收到的ETag头或者是Last-Modfied中的最后修改时候。服务端在收到续传请求时,通过If-Range中的内容进行校验,校验一致时返回206的续传回应,不一致时服务端则返回200回应,回应的内容为新的文件的全部数据。
JavaScript实现访问本地文件夹
实现JavaScript访问本地文件夹功能,利用`showDirectoryPicker()` API可完成选择文件夹的简单操作。此API提供了丰富的选项,如`id`、`mode`与`startIn`,确保了不同用户间的目录记忆、访问权限与起始目录的灵活性。返回值是一个`Promise`对象,兑现为`FileSystemDirectoryHandle`,若用户拒绝访问,将抛出`A...
大文件上传之分片方案
第一步,文件MD5加密是分片上传的关键。通过MD5算法确保文件的唯一性,便于跟踪文件上传状态。使用spark-md5工具结合文件修改时间、名称和最后修改时间生成MD5码。在文件读取过程中,利用文件读取进度条显示上传进度,确保MD5码的准确性和完整性。第二步,查询文件状态。前端依据文件MD5码查询后台数据库或文件...
图片上传至文件夹后,如何在数据库中添加图片的路径,并显示。
language="javascript">parent.addnews.image.value='<%=upfile%>';放长传文件这样就可以了
Javascript读取某文件夹下的所有文件
fileName = fso.FileExists("c:\\autoexec.bat");if (fileName) alert("你在C盘中有autoexec.bat文件,按下确定后这个文件将被删除!"); //开个玩笑:)--> </SCRIPT> FolderExists(目录名) //检查一个目录是否存在,如果存在就返会真,不存在就返回...<SCRIPT LANGUAGE="JavaScript"> <!--...
请问如何通过JavaScript或jQuery动态更改浏览器默认下载文件夹路径呢...
绝大部分情况下是无法实现的。文件夹相关的操作权限,如读取文件夹名字,读取文件夹所在的操作系统的路径,是高度敏感的权限。浏览器开发商如chrome、火狐、360安全等,他们是不会允许网页开发者读取到客户端访问者的文件夹操作权限的。
PHP 大文件上传,支持断点续传,求具体方案、源码或者文件上传插件
HTTP协议里, 对断点下载有支持.断点上传单纯靠PHP 是做不了的.因为普通的浏览器端没那功能.(上传的时候 还是会整个文件编码发送)想实现的话 , 客户端需要插件了,客户端可以使用flex实现. 服务端, PHP可以写个webservice 接受文件.
如何用Ajax实现多文件上传
jquery 实现多个上传文件教程:首先创建解决方案,添加jquery的js和一些资源文件(如图片和进度条显示等):1 2 3 4 5 jquery-1.3.2.min.js jquery.uploadify.v2.1.0.js jquery.uploadify.v2.1.0.min.js swfobject.js uploadify.css 1、页面的基本代码如下 这里用的是aspx页面(html也是也可的)...
怎么实现本地上传文件并获取文件路径
1.调用AddFile函数添加本地文件,注意路径需要使用双斜框(\\)2.调用PostFirst函数开始上传文件。JavaScript code ?1 2 3 4 5 6 7 8 9 10 11 12 13 var uploaderMgr = new HttpUploaderMgr();uploaderMgr.Load();//加载控件 window.onload = function(){ uploaderMgr.Init();//初始化控件...
ASP上传文件代码
f.SaveToFile server.mappath("/images/"& h),2 '上传至“/images/”文件夹中 f.Close set f=Nothing a.Close set a=Nothing response.write ""&h&""end if > function checkupload(){ if(document.upload_form.fe.value ==""){ alert("未选择要上传的文件");return false;} } ...
javascript如何统计一个文件夹里面有多少个文件
function ShowFolderFileList(folderspec){ var fso, f, f1, fc, s;fso = new ActiveXObject("Scripting.FileSystemObject");f = fso.GetFolder(folderspec);fc = new Enumerator(f.files);s = "";for (; !fc.atEnd(); fc.moveNext()){ s += fc.item();s += "";} return(s);} ...