此文档已过期,文件上传不支持断点续传功能,上传数据使用HTTP/HTTPS标准规范Multipart/form-data格式
技术规范
文件上传传输协议基于标准的http协议中的multipart/form-data格式,为支持断点续传功能,采用对HTTP协议扩展,规定单个文件上传的Range,用于保存上传的数据段位置信息。
文件上传业务需兼容https协议,可无缝切换到https传输通道。
文件上传业务流程
为了兼容各种服务器,5+ runtime需兼容两种模式,在连接不支持断点续传的服务器时采用非断点方式上传,在连接支持断点续传的服务器时采用断点模式分段提交数据。
文件删除传输协议
-
向服务器询问是否支持断点续传
该查询包括服务器是否支持扩展协议和任务上传的状态,每次任务启动时都要进行查询,如果服务器发送的格式错误认为不支持,直接使用标准HTTP协议传输。
上传数据格式(POST):
HTTP头
Content-Type:application/x-www-form-urlencoded
数据体
数据体格式为url参数对需要进行url编码,包括以下字段:
server:固定为字符串"uploader" ;
action:固定为字符串"query";
boundary:采用multipart/form-data格式的boundary值;
如:
server=uploader&action=query&boundary= ----WebKitFormBoundaryaXBIy1C8VXJFfgdS
Boundary 值为客户端提交的上传任务唯一标识,由客户端生成提交。 -
服务器返回断点续传信息
服务器下发数据为JSON格式,内容携带protocal、 support、file、data等字段,格式如下:
{
protocol: "uploder",
support: true,
boundary: "boundary",
file: [ { name: "headimage",
range: "0-102400"
}
],
data: [ { name: "name"
}
]
}
protocol 值为uploader可没有
support 值为Bool,必选 用来只是服务器是否支持此协议
boundary 值为boundary,必选 跟客户端上传的boundary一致
file值为file对象数组,关于file对象的约定,name为单个文件的唯一标识,值跟客户端上上传的字段名一致,必须包含range字段标识服务器已经接受的数据范围,其他属性不做要求 -
客户端向服务器提交上传数据
数据发送采用标准HTTP MIME封装格式的扩展Content-Type为multipart/form-data;boundary=%boundaryid%,其中boundaryid值用于标识上传任务,客户端需通过算法生成任务标识保证其唯一性。
为了支持上传文件的断点续传,在multipart/form-data格式的数据段中,需扩展Content- Disposition字段,添加range属性,其值用于表明当前传输的数据段,格式如下:
Content- Disposition: …; range=”start-end/totalsize”,示例如下:
Content- Disposition: form-data; name="file"; filename="image.jpg"; range=”102400-204800/456770”
若服务器不支持断点续传,则不传输range属性数据。
服务器在收到数据后根据Range进行文件组装,成功完整后返回200,客户端发送下一段数据。 -
服务器返回提交上传数据结果
服务器接收到上传数据后根据Range进行文件组装,操作成功后返回200,并在数据体中下发JSON数据,内容携带result字段,格式如下:
{
result: "OK",
code: %ErrorCode%,
message: "Error message"
}
result 值为上传数据的结果,上传成功固定值为"OK",上传失败固定值为"ERROR"。
code 值为可选数据,数字类型,通常在上传失败时用于保存错误代码,成功时其值为0,参考错误列表。
message 值为可选数据,通常在上传失败时用于保存错误提示信息。
服务器如果接收数据失败则http头中的,如4xx。
错误列表:错误代码 说明 0 Success 4001 File exceeded upload_max_filesize 4002 File exceeded max_file_size 4003 File only partially uploaded 4004 No file uploaded 4006 Cannot upload file: No temp directory specified 4007 Upload failed: Cannot write to disk 4008 File upload stopped by extension
示例
-
向服务器询问是否支持断点续传
POST /FileUploader/ HTTP/1.1
Host: www.baidu.com
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 46
Accept-Language: en-us
Accept: /
Connection: keep-alive
User-Agent: MSC_Pandora/1.0 CFNetwork/609.1.4 Darwin/11.4.2
server=uploader&action=query&boundary=----WebKitFormBoundaryaXBIy1C8VXJFfgdS -
服务器返回断点续传信息
HTTP/1.1 200 Found
Date: Mon, 25 Mar 2013 03:00:35 GMT
Server: Apache
Location: http://www.baidu.com/search/error.html
Cache-Control: max-age=86400
Expires: Tue, 26 Mar 2013 03:00:35 GMT
Content-Length: 222
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
{protocol:”uploder”,support:true,boundary:”----WebKitFormBoundaryaXBIy1C8VXJFfgdS”, file:[{name:”headimage”,range:”0-102400”}],data:[{name:”name value”}]} -
客户端向服务器提交上传数据
POST /FileUploader/servlet/Uploader HTTP/1.1
Host: localhost:8080
Referer: http://localhost:8080/FileUploader/
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryaXBIy1C8VXJFfgdS
Content-Length: 104010
Accept-Language: en-us
Origin: http://localhost:8080
Accept-Encoding: gzip, deflate
Cookie: JSESSIONID=D59492623EA81462A605B216B4A9E976
Connection: keep-alive
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B141
------WebKitFormBoundaryaXBIy1C8VXJFfgdS
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg
......JFIF.............XExif..MM.*...................i.........&.............................6...........5.......C.........................................
......QE..QE..QE..QE..QE..QE..QE..QE..QE..QE..QE..QE..QE..QE..QE..QE..QE..QE....
------WebKitFormBoundaryaXBIy1C8VXJFfgdS
Content-Disposition: form-data; name="file"; filename="image.jpg"; range=”102400-204800/456770”
Content-Type: image/jpeg
......JFIF.............XExif..MM.*...................i.........&.............................6...........5.......C.........................................
....
------WebKitFormBoundaryaXBIy1C8VXJFfgdS
Content-Disposition: form-data; name="submit"
......
------WebKitFormBoundaryaXBIy1C8VXJFfgdS--
- 服务器返回上传数据结果
HTTP/1.1 200 OK
Date: Mon, 25 Mar 2013 03:00:35 GMT
Server: Apache
Location: http://www.baidu.com/search/error.html
Cache-Control: max-age=86400
Expires: Tue, 26 Mar 2013 03:00:35 GMT
Content-Length: 222
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
{result:”OK”}
14 个评论
要回复文章请先登录或注册
雪之梦技术驿站
fx5252
Beiizl
登