最近有个需求,需要在flutter中用put的方式传输固件到设备上,本来以为用dio或者http这两个框架就能轻松完成的,结果发现,这两个框架传输过去的文件都会修改了源文件,把请求头的分隔符也带进去了,设备无法识别就升级不了。
图如下:
(这个是使用dio传输的,错误文件)
(这个是源文件)
通过对比,发现用dio和http传输的文件都会把头部也写入源文件下,这样就会导致设备无法识别,我查阅了官网和源码,也无法分析出到底是哪里导致此问题的发生,如果有知道的小伙伴可以通过下方评论告知我。
现在我们说一下解决方案,我这个解决方案不是最终解决方案,只是替代,临时解决,方法如下:
我们使用flutter最基础的网络框架clienthttp来实现我们的文件传输就没有该问题了,代码如下:
try{
String fileNames = "您要传输的文件名";
String urlPath = "您要传输的URL";
HttpClient httpClient = new HttpClient();
HttpClientRequest requests = await httpClient.putUrl(Uri.parse(urlPath));
requests.add(file.readAsBytesSync());
final response = await requests.close();
print('Response status: ${response.statusCode}');
await response.transform(utf8.decoder).forEach(print);
httpClient.close();
if (response.statusCode == 200) {
Fluttertoast.showToast(msg: "升级成功");
} else {
Fluttertoast.showToast(msg: "升级失败");
}
} catch (e) {
print('downloadFile error---------$e');
}
使用上面的代码后,我们会发现,传输到固件的文件就不会带有分隔符,这样设备就能正常识别并且升级,我对比后猜测是dio和http这两个框架在底层默认使用了表单这种方式去传输文件,所以表单才会把头部也写入了文件中,而且它们是针对服务器的,服务器能好好的识别这些信息然后剔除掉,但是我们用来传输给设备,设备不做这种识别就会出现上面的问题。也不知道猜测是否准确,有知道的大佬可以评论下留言交流。