DCloud_App_Array
DCloud_App_Array
  • 发布:2014-12-11 17:16
  • 更新:2019-01-31 12:48
  • 阅读:18401

Uploader文件上传数据传输协议

分类:HTML5+

技术规范

文件上传传输协议基于标准的http协议中的multipart/form-data格式,为支持断点续传功能,采用对HTTP协议扩展,规定单个文件上传的Range,用于保存上传的数据段位置信息。
文件上传业务需兼容https协议,可无缝切换到https传输通道。

文件上传业务流程

文件上传流程图
为了兼容各种服务器,5+ runtime需兼容两种模式,在连接不支持断点续传的服务器时采用非断点方式上传,在连接支持断点续传的服务器时采用断点模式分段提交数据。

文件删除传输协议

文件上传时序图

  1. 向服务器询问是否支持断点续传
    该查询包括服务器是否支持扩展协议和任务上传的状态,每次任务启动时都要进行查询,如果服务器发送的格式错误认为不支持,直接使用标准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 值为客户端提交的上传任务唯一标识,由客户端生成提交。

  2. 服务器返回断点续传信息
    服务器下发数据为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字段标识服务器已经接受的数据范围,其他属性不做要求

  3. 客户端向服务器提交上传数据
    数据发送采用标准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,客户端发送下一段数据。

  4. 服务器返回提交上传数据结果
    服务器接收到上传数据后根据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

示例

  1. 向服务器询问是否支持断点续传
    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

  2. 服务器返回断点续传信息
    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”}]}

  3. 客户端向服务器提交上传数据
    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--

  1. 服务器返回上传数据结果
    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”}
3 关注 分享
Joshua guyskk 雪之梦技术驿站

要回复文章请先登录注册

___K

___K

task.setRequestHeader('AAA','BBB'); 这样加协议头
2019-01-31 12:48
hjiacheng@126.com

hjiacheng@126.com

WAP2APP 项目,打包后,安卓的运行正常 ,苹果的 提交表单 通过post方法 ,服务器端接收不到数据?
2019-01-20 10:16
Blue_sky氵

Blue_sky氵

请问上传第一次询问怎么调用
2018-09-20 13:32
sflong

sflong

Ios上传文件:Content-Type: multipart/form-data; boundary=io.dcloud.uploader15118593167911,与android的ContentType不同,导致ios上传的图片打不开,怎么解决
2017-11-30 22:37
雪之梦技术驿站

雪之梦技术驿站

完全看不懂啊
2017-07-25 20:48
fx5252

fx5252

plus.uploader.createUpload 如何添加请求头部信息: +到url地址上,如"http://www.baidu.com"+'?token=' + account.token
2015-08-17 10:48
Beiizl

Beiizl

怎么设置不检查断点续传啊
2015-08-12 12:06
登

请问 上传文件 plus.uploader.createUpload 如何添加请求头部信息啊 例如我要添加 Authorization: 4Kt58pkZdWwBhm7B6DWcIwebQQJhPTEwMDAxMjkw
2015-08-12 10:27