分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

从IIS网站上下载AssetBundle,并写入到本地磁盘指定路径

发布时间:2023-09-06 02:00责任编辑:郭大石关键词:暂无标签
啊,长叹一声,弄了一晚上,加半个白天

先说说历程吧,主要是踩的坑。

首先打包就不用说了。有.asseetbundle的,有.u3d的,还有就是生成md5列表

然后下载并保存就恶心了。

本来想的很好,思路其实也正确。

AssetBundle生成到StreamingAssets文件夹下
我在本机上(win10x64),IIS开了个站,开了FTP,用FileZilla把StreamingAssets文件夹上传到站上。
这样这些AssetBundle就有了url:“http://localhost:9999/StreamingAssets/a.assetbundle”

上传后,把本地的StreamingAssets文件夹删掉,程序中判断如果没有这个文件夹,则创建,下载md5列表文件,按文件中列出的文件列表把远程服务器上的所有assetbundle下载到本地来。这个过程的代码就不说了,不复杂,执行的也很顺利。主要是从下面开始坑了。

用WWW,从远程url地址下载,再用二进制写入本地路径文件

string localFilePath = "..."; ????????//要保存到本地的文件全路径string savePath = "..."; ??????????????//文件存储的文件夹string url = "http://..."; ?????????????????//要下载的远程文件地址//判断一下文件要存储的文件夹是否存在,不存在则创建if(!Directory.Exists(savePath)){ ???????Directory.CreateDirectory(savePath);}//下载using(WWW www = new WWW(url)){ ???????yield return www; ???????if(www.error == null && www.isDone) ???????{ ???????????????//写入本地文件 ???????????????File.WriteAllBytes(localFilePath, www.bytes); ???????}}

好的,到此为止,没有任何错误,StreamingAssets文件夹里的所有东东都下载到本地了,看文件大小好像也没有问题。

既然下载下来了,就得用啊,还是用WWW吧

string localFilePath="file:///.."; ????????????//本地要加载的AssetBundle文件路径using(WWW www = new WWW(localFilePath)){ ???????yield return www; ???????if(www.error ==null && www.isDone) ???????{ ???????????????AssetBundle ab = www.assetBundle; ???????????????GameObject go = ab.LoadAsset<GameObject>("go"); ???????}}

就在这一步

AssetBundle ab = www.assetBundle;

报错了:
Failed to decompress data for the AssetBundle ‘Memory‘`

但是请注意,用new WWW(localFilePath) 加载是没有任何问题的。

百撕不得其姐,于是搜索引擎查呗

一种说法是FileZilla向网站上传时要设置二进制

好吧,设置了,删掉重新上传,还是这样

于是把上传的文件直接拷贝过来,而不是在程序中用WWW下载,可以用,加载包没有问题

这就不好玩了,但是能确定的是问题是出在从远程下载并保存到本地这个步骤

那就换一种下载方法

用UnityWebRequest

using (UnityWebRequest req = UnityWebRequest.Get(fileUrl)) ???????????????????????{ ???????????????????????????????????????????????????????string filePath = "..."; ???????????????????????????string savePath = "..."; ???????????????????????????if (!Directory.Exists(savePath)) ???????????????????????????{ ???????????????????????????????Directory.CreateDirectory(savePath); ???????????????????????????} ???????????????????????????yield return req.SendWebRequest(); ???????????????????????????if (req.isNetworkError || req.isHttpError) ???????????????????????????{ ???????????????????????????????Debug.LogError(req.downloadHandler.text); ???????????????????????????} ???????????????????????????else ???????????????????????????{ ???????????????????????????????File.WriteAllBytes(filePath, req.downloadHandler.data); ???????????????????????????????Debug.Log(fileUrl + " downloaded"); ???????????????????????????} ???????????????????????}

这回更有趣,只下载了.manifest文件,而assetbundle还有.u3d这些包没有下载

看了一下,报的错是404 File Not Found

底下还提到了MIME映射

度娘查了一下,终于发现了真正的问题。

程序是没问题的,思路是正确的,问题出在了IIS的设置上

具体的说就是MIME的设置

即IIS中需要对不同的文件类型进行MIME映射才能使其类型的文件能在网站端正常的被读取下载,大概是这个意思。那就设置吧

win+R

输入compmgmt.msc回车

点击‘添加’

如上图
扩展名把你打包的扩展名填进去,如我是用的assetbundle和u3d
MIME类型中填写:application/octet-stream

好了,重启一下网站,再运行,OK了,正常下载和加载,出了一个小问题
就是文件夹下名为StreamingAssets的文件,即与文件夹同名,无扩展名的文件无法下载

再查一下

还是要设置MIME,无扩展名怎么办

还是上图,在文件扩展名一栏中填一个点"."
MIME一栏还是填:application/octet-stream

OK了

至于manifest文件,本身就在IIS的默认设置里有

也就是说,用IIS,一定要把你打包的assetbundle文件扩展类型设置MIME,比如你打的包是xxx.ab,那ab就要像这样设置MIME映射

再回过头来,还把UnityWebRequest换回WWW的加载方式,也OK了

即 ,此次问题就是出在IIS的设置上,思路和程序没有问题。

总结:

  1. 上传时用二制方式上传,因为都是二进制文件
  2. IIS的MIME设置要搞好

问题解决,大满足

从IIS网站上下载AssetBundle,并写入到本地磁盘指定路径

原文地址:http://blog.51cto.com/shuxiayeshou/2130970

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved