Bootstrap

flutter 用PUT的方式传输文件不带分隔符

        最近有个需求,需要在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这两个框架在底层默认使用了表单这种方式去传输文件,所以表单才会把头部也写入了文件中,而且它们是针对服务器的,服务器能好好的识别这些信息然后剔除掉,但是我们用来传输给设备,设备不做这种识别就会出现上面的问题。也不知道猜测是否准确,有知道的大佬可以评论下留言交流。

;