H5如何读取二进制文件?

我是读文件大哥 不是http请求

如果是网页端,你的文件总是放在服务器上吧,服务器上你不需要先http么?通过http,指定接受数据为ArrayBuffer,拿到数据后解析。

如果你是原生,jsb.fileUtils.getDataFromFile

h5就是要通过http请求读文件啊

那这个文件如何缓存,如果本地已经有了,不能继续下载了

有没有大神可以给个方案

星期一了该顶顶了

Web端,楼上已有回复,Native端的话,需要自己封装JSB接口,目前引擎没有二进制数据的操作接口。

web端他说的还是不对啊,就算第一次http读,如何缓存到本地?缓存到本地的如何重新读?不可能每次都下载这个文件的

为何不对,我看就很对啊,读文件要发起http请求,请求到数据之后的缓存处理是另做的需求啊

浏览器会自动对文件做缓存的,这个是浏览器的功能,引擎这边不做解释。

可能是我没表达清楚,我希望可以声明个cc.Binary的文件类型,然后用md5会非常方便

网页端是依托浏览器环境的 不是想怎么样怎么样的

通过 jsb.fileUtils.getDataFromFile 得到Uint8Array,然后通过DataView 不是可以操控了么?
至于Native缓存
1,下载之前先看缓存目录有没有,如果有加载缓存目录,否则去下载
2,下载完成后写到缓存

浏览器环境下,JS控制不了浏览器缓存,也不知道浏览器是否有缓存,这个是浏览器根据自身的缓存策略和http请求的header中Expires/Cache-Control等字段(在服务端设置,或在HTML的meta标签中设置)共同决定的。一般情况下,你第一次在JS中用http请求文件,浏览器会下载文件并缓存到浏览器的缓存文件夹,第二次在JS中用http读,若缓存未过期,浏览器会使用缓存的文件,并没有每次都下载。你可以看一下:彻底弄懂HTTP缓存机制及原理
如果你希望做JS可控的缓存且文件体积不大,那用localStorage(各种浏览器的容量限制在2M~5M左右),在Cocos Creator中就是cc.sys.localSotrage
另外有些浏览器支持FileSystem API,可以用JS模拟文件系统读写大文件。不过浏览器支持不佳,最好使用Chrome, Firefox, Edge。

楼主最后是怎么解决的啊,小白一枚,求指教

我就不明白了,难道引擎组的老大都认为游戏不需要读自定义格式的文件,难道都是如他们所想的使用文本文件
一个简单的读文件的api都做得不理想,还谈何做引擎 ?!
看看unity的读文件的api,看看人家是怎么做的!!!

楼主应该说的是读取放在工程中的二进制文件吧,分享一下我的做法
主要分两步

  1. 获取资源的真实路径,有两种方法

    • 使用 cc.url.raw 获取,推荐这种方法

      // 获取真实路径
      let binaryFile = 'resources/filename'; // 要求必须放在 resources 目录下
      let extensionName = '.bin'; // 后缀名
      let url = cc.url.raw(binaryFile) + extensionName;
      
    • 在组件中定义 cc.Asset 类型资源,把二进制文件拖进去,但是引擎会报警告

      const {ccclass, property} = cc._decorator;
      @ccclass
      export default class YourComponent extends cc.Component {
          @property(cc.Asset)
          binaryAsset: cc.Asset = null;
          onLoad () {
              let url = this.binaryAsset.toString();
          }
      }
      /**
       * 引擎将会警告
       * Please change the definition of property 'aaaaaa' in class 'YourComponent'. Starting from v1.10,
       * properties in CCClass can not be abbreviated if they are of type RawAsset.
      */
      
  2. 使用获取到的真实路径 url 拿到二进制数据,这里也有两种做法

    • 使用 cc.loader.load 获取,这种方法在原生环境和 Web 环境都有效,推荐使用这种方法

      cc.loader.load(
          { url: url, type: 'binary'},
          (err, binaryData: Uint8Array) => {
              if (err) {
                  console.error(err.message || err);
              } else {
                  // todo
              }
          }
      );
      
    • 使用 jsb.fileUtils.getDataFromFile 获取,但只能在原生环境使用

      let binaryData: Uint8Array = jsb.fileUtils.getDataFromFile(url);
      

当然楼上说的,使用 HTTP 请求远程数据也是可以的

2赞

多说一句,这种方法也是看引擎摸索,尝试了一段时间才试出来的,但是如果由引擎提供一种 BinaryAsset 的资源类型,用来保存用户自定义的二进制数据,这当然是最好的

大佬,方法2在浏览器和原生环境中都是可以的,但是到了微信(小游戏)中就不起作用了,是Cocos creator 2.3.2的版本,你试过吗?