我是读文件大哥 不是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,看看人家是怎么做的!!!
楼主应该说的是读取放在工程中的二进制文件吧,分享一下我的做法
主要分两步
-
获取资源的真实路径,有两种方法
-
使用 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. */
-
-
使用获取到的真实路径 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 请求远程数据也是可以的
多说一句,这种方法也是看引擎摸索,尝试了一段时间才试出来的,但是如果由引擎提供一种 BinaryAsset 的资源类型,用来保存用户自定义的二进制数据,这当然是最好的
大佬,方法2在浏览器和原生环境中都是可以的,但是到了微信(小游戏)中就不起作用了,是Cocos creator 2.3.2的版本,你试过吗?