# 文件上传

物联网平台支持设备通过MQTT协议方式,将文件上传至用户自己的OSS空间进行储存。本文介绍设备上传文件流程相关的Topic和数据格式,包括设备请求上传文件、设备上传文件分片和设备取消上传文件。

# 背景信息

  • 择将文件上传至您自己的OSS空间,设备上传文件后,您可以在OSS中访问文件。
  • OSS Bucket必须为设备所属用户所有,Bucket地域必须与设备所属地域相同。

# 设备请求上传文件

  • 请求Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/init
  • 响应Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/init_reply

请求数据格式:

{
  "id": "123456",
  "params": {
    "fileName": "abc.bin",
    "fileSize": 123455,
    "conflictStrategy": "overwrite",
    "ficMode": "crc64",
    "ficValue": "0205d7***",
    "initUid": "ab1***34",
    "extraParams": {
      "ossOwnerType": "device-user",
      "serviceId": "device1.bucket",
      "fileTag": {
        "tagKey1": "tagValue1",
        "tagKey2": "tagValue2"
      }
    }
  }
}

请求参数说明:

参数 类型 说明
id String 消息 ID 号。String 类型的数字,取值范围 0~4294967295,且每个消息 ID 在当前设备中具有唯一性。
params Object 请求业务参数。
fileName String 设备上传文件的名称。限制如下:
- 支持数字、英文字母、下划线(_)和英文句点(.)。
- 首字符仅支持数字和英文字母。
- 长度不超过 100 字节。
fileSize Long 上传文件大小,单位字节。单个文件大小不超过 16 MB。
取值为 -1 时,表示文件大小未知。文件上传完成时,需在上传文件分片的消息中,指定参数 isComplete,具体说明,请参见设备上传文件分片。
conflictStrategy String 物联网平台对设备上传同名文件的处理策略。非必填参数,默认为 overwrite
使用说明:
- 若物联网平台不存在同名文件,直接创建文件的上传任务。
- 若物联网平台已存在同名文件,则按照设置的策略,进行如下处理:
- overwrite:覆盖模式。先删除同名文件,再创建文件的上传任务。

从创建文件上传任务成功开始计时,如果 24 小时内设备端未完成上传,物联网平台云端会自动删除该文件上传任务
ficMode String 文件的完整性校验模式,目前可取值 crc64。非必传参数。
- 若不传入,在文件上传完成后不校验文件完整性。
- 若传入,与 ficValue 同时传入,根据校验模式和校验值校验文件完整性。

若 fileSize 值为 -1,不支持设置 ficMode 和 ficValue
ficValue String 文件的完整性校验值,是 16 位的 Hex 格式编码的字符串。
非必传参数。若传入,与 ficMode 同时传入。
initUid String 自定义的设备请求上传文件的任务唯一 ID,同一上传任务请求必须对应相同的唯一 ID。限制如下:
- 支持数字、英文字母、短划线(-)、下划线(_)和英文句点(.)。
- 首字符仅支持数字和英文字母。
- 长度不超过 16 个字符。
该参数可选:
- 传入:用于设备请求上传文件的消息,在重发场景下的幂等性处理。您需确保同一上传文件任务的重试消息使用相同的 initUid。在同一设备下,该参数相同的两个上传请求消息,会被物联网平台云端识别为消息重试,返回相同的文件请求上传的响应消息。在同一设备下,若重试的时间间隔超过 24 小时,则重试的请求会识别为新的文件上传任务请求。此时若请求上传文件成功,则返回新的 uploadId
- 不传入:物联网平台的云端识别当前请求为新的文件上传请求。
extraParams Object 设备上传文件至 OSS 存储空间的配置参数。必传参数。
ossOwnerType String 设备上传文件的目标 OSS 所有者类型。可取值:
- device-user:表示上传到设备所属用户自己的 OSS 存储空间中。
上传的文件不会在物联网平台控制台的设备文件列表中展示,也不能通过相关的云端 API 管理。
文件上传位置为:{ossbucket}/aliyun-iot-device-file/${instanceId}/${productKey}/${serviceId}/${deviceName}/${fileName}
{ossbucket}:在物联网平台控制台已配置的目标 Bucket。
{instanceId}:设备所属实例的 ID。
{productKey}:设备所属产品的 ProductKey
{serviceId}:在物联网平台控制台已配置的业务 ID。
{deviceName}:设备名称。
{fileName}:设备文件名称。
serviceId String 文件上传相关的业务 ID。该 ID 需要在物联网平台控制台预先定义。具体操作,请参见配置设备文件上传至 Bucket。仅 ossOwnerTypedevice-user 时,serviceId 有效。
fileTag Object 文件保存到 OSS 存储空间携带的标签,最多包含 5 个。标签定义规则,请参见对象标签。标签 Key 不能以 2 个下划线(__)开头。仅 ossOwnerTypedevice-user 时,fileTag 有效。

响应数据格式:

{
  "id": "123456",
  "code": 200,
  "message": "this is error msg when code is not 200",
  "data": {
    "fileName": "abc.bin",
    "uploadId": "03d9151e-6***",
    "offset": 123123
  }
}

响应参数说明:

参数 类型 说明
id String 消息 ID 号。String 类型的数字,取值范围 0~4294967295,且每个消息 ID 在当前设备中具有唯一性。
code Integer 结果码。返回 200 表示成功,返回其他状态码,表示失败,具体请参见设备端接收的错误码。
message String 请求失败时,返回的错误信息。
data Object 返回设备端的数据。
fileName String 设备上传文件的名称。
uploadId String 本次上传文件任务的标识 ID。后续上传文件分片时,需要传递该文件标识 ID。
offset Long 返回的已上传文件的大小,单位为字节。

# 设备上传文件分片

  • 请求Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/send
  • 响应Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/send_reply

请求数据格式:

  • 结构如下图:

img.png

结构项 说明
Header Length 表示请求 Header 中 JSON 字符串对应的字节数组长度,必须占位 2 个字节,高位字节在前,低位字节在后。
例如,Header 的 JSON 字符串使用 UTF-8 编码转码成字节数组的长度为十进制的 87,对应十六进制 57,则高位字节为 0x00,低位字节为 0x57。
Header String Bytes 表示请求 Header 中 JSON 字符串对应的字节数组,编码格式为 UTF-8。具体内容,请参见下文的“Header 的 JSON 数据格式”。
File Block Bytes 表示当前文件分片的字节数组,字节顺序按照相对于文件头的偏移量从小至大排列。
CRC16/IBM 表示文件分片的校验值,仅支持 CRC16/IBM,占位 2 个字节,低位字节在前,高位字节在后。
例如,文件分片的校验值为 0x0809,则低位字节为 0x09,高位字节为 0x08。
  • Header的JSON数据格式:
{
  "id": "123456",
  "params": {
    "uploadId": "03d9151e-6***",
    "offset": 34344,
    "bSize": 123455,
    "isComplete": true
  }
}

请求参数说明:

参数 类型 说明
id String 消息 ID 号。String 类型的数字,取值范围 0~4294967295,且每个消息 ID 在当前设备中具有唯一性。
params Object 请求业务参数。
uploadId String 设备请求上传文件时返回的文件上传任务标识 ID。
offset Long 已上传文件分片的总大小,单位为字节。
bSize Long 当前上传文件分片的大小,单位为字节。
非最后一个分片时,分片大小范围为 256 B~131072 B。
最后一个文件分片时,若上传的文件大小已知,则分片大小范围为 1 B~131072 B;若上传的文件大小未知,则分片大小范围为 0 B~131072 B。
isComplete Boolean 仅当设备请求上传文件中 fileSize 为 -1,即文件大小未知时,该参数有效,表示当前分片是否是文件的最后一个分片。
- true:是。此时,物联网平台的云端会校验已上传文件大小是否超过 16 MB:
- 未超过:若文件大小大于 0,则文件上传成功。若文件大小为 0,则返回文件不能为空的错误信息且删除文件上传任务。
- 超过:返回文件大小超过 16 MB 的错误码,并删除已上传的文件。详细说明,请参见设备上传文件相关错误码。
- false:否。表示不是最后一个文件分片,需继续上传文件。

响应数据格式:

  • 未知大小的文件上传过程中,上传文件大小若超过16 MB,则返回文件大小超过16 MB的错误码78117,且物联网平台云端会自动取消文件上传任务,并删除已上传的文件。
{
  "id": "123456",
  "code": 200,
  "message": "this is error msg when code is not 200",
  "data": {
    "uploadId": "03d9151e-6***",
    "offset": 34344,
    "bSize": 123455,
    "complete": true,
    "ficMode": "crc64",
    "ficValueClient": "0205d7***",
    "ficValueServer": "0205d7***"
  }
}

响应参数说明:

参数 类型 说明
id String 消息 ID 号。String 类型的数字,取值范围 0~4294967295,且每个消息 ID 在当前设备中具有唯一性。
code Integer 结果码。返回 200 表示成功,返回其他状态码,表示失败,具体请参见设备端接收的错误码。
message String 上传失败时,返回的错误信息。
data Object 返回设备端的数据。
uploadId String 本次上传文件任务的标识 ID。后续上传文件分片时,需要传递该文件标识 ID。
offset Long 已上传文件分片的总大小,单位为字节。
bSize Long 当前上传文件分片的大小,单位为字节。
非最后一个分片时,分片大小范围为 256 B~131072 B。
最后一个文件分片时,若上传的文件大小已知,则分片大小范围为 1 B~131072 B;若上传的文件大小未知,则分片大小范围为 0 B~131072 B。
complete Boolean 当上传了最后一个分片数据后,文件上传完成,返回该参数,值为 true。
若设备请求上传文件的请求消息中 fileSize 值大于 0,即文件大小已知时,若已上传的文件大小与设备请求上传文件时的文件大小相同,文件被识别为上传完成。
若设备请求上传的请求消息中 fileSize 值为 -1,即文件大小未知时,若文件分片上传请求中 isComplete 存在且值为 true,文件被识别为上传完成。
ficMode String 文件的完整性校验模式。若请求上传文件时传入了该参数,对应的值仅支持为 crc64
ficValueClient String 文件上传完成,返回设备请求上传文件时的 ficValue 值。
ficValueServer String 文件上传完成,返回物联网平台云端计算的文件完整性校验值。该值与 ficValueClient 值相同,表示文件上传完整。

# 设备取消上传文件

  • 请求Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/cancel
  • 响应Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/cancel_reply

请求数据格式:

{
  "id": "123456",
  "params": {
    "uploadId": "03d9151e-6***"
  }
}

请求参数说明:

参数 类型 说明
id String 消息 ID 号。String 类型的数字,取值范围 0~4294967295,且每个消息 ID 在当前设备中具有唯一性。
params Object 请求业务参数。
uploadId String 设备请求上传文件时返回的文件上传任务标识 ID。

响应数据格式:

{
  "id": "123456",
  "code": 200,
  "message": "uploading task for upload-id xxxx does not exist.",
  "data": {
    "uploadId": "03d9151e-6***"
  }
}

响应参数说明:

参数 类型 说明
id String 消息 ID 号。String 类型的数字,取值范围 0~4294967295,且每个消息 ID 在当前设备中具有唯一性。
code Integer 结果码。返回 200 表示成功,返回其他状态码,表示失败,具体请参见设备端接收的错误码。
message String 请求失败时,返回的错误信息。
data Object 返回设备端的数据。
uploadId String 取消的文件上传任务标识 ID。