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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从IIS网站上下载AssetBundle,并写入到本地磁盘指定路径相关的知识,希望对你有一定的参考价值。

啊,长叹一声,弄了一晚上,加半个白天

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

首先打包就不用说了。有.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,并写入到本地磁盘指定路径的主要内容,如果未能解决你的问题,请参考以下文章

assetbundle服务器配置下载

在硬盘中下载 AssetBundle

用unity的www去下载assetbundle速度很慢!!怎么解决??

如何实现 AssetBundle 的依赖部分从 Resource 获取

unity 是怎么加载assetbundle

从 CASSINI 传递到 IIS 7