介绍 mqtt 传输文件的案例
- 背景:使用 mqtt 传输10m内的文件
- 思路:参考tcp的分包规则,将文件按一定大小拆分多块,分块传输后再合并成文件
实现
文件分块实体类
@AllArgsConstructor
public class FileDataVo implements Serializable {
/**
* 文件唯一标识
*/
private String fileId;
/**
* 文件名:hello.png
*/
private String fileName;
/**
* 文件块:Base64加密字节数组
* 每块最大值为 1m
* ' 设置为1m的原因:大部分文件在 1m以内,只需要发送一条消息即可
*/
private String content;
/**
* 文件块排序
*/
private long sort;
/**
* 总块数
* 文件最大值10m,即最大10块
*/
private long size;
}
文件发送方(生产者)
// 分块大小
int length = 1024 * 1024;
// 文件块数
long size = (file.length() / length) + 1;
// 文件块排序
long sort = 1;
// 每次读取1m
byte[] bytes = new byte[length];
while (is.read(bytes) > 0){
// base64加密字节数组
String base64 = Base64.encodeToString(bytes) ;
// 发送
FileDataVo fileDataVo = new FileDataVo(fileId, fileName, base64, sort, size);
send(fileDataVo);
sort++;
}
文件接收方(消费者)
// key: fileId
Map<String, List<FileDataVo>> map = new HashMap<>();
// 持续接收文件块
messageArrived();
// 当 fileDataList == size时,即接收完成,开始输出文件
fileDataVoList.size() == fileDataVo.getSize();
// 按块排序
fileDataVoList.sort();
// 输出到文件
for (FileData data : fileDataVoList) {
// base64解密字节数组
byte[] bytes = Base64.decode(data.getContent()) ;
os.write(bytes);
}