此文档已过期,文件上传不支持断点续传功能,上传数据使用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 个评论
要回复文章请先登录或注册
1***@163.com
风中的承诺
浅笑半生
1***@qq.com
浅笑半生
浅笑半生
___K
h***@126.com
Blue_sky氵
sflong