unity下载文件三(http异步下载)

异步下载,顾名思义就是不影响你主线程使用客户端的时候,人家在后台搞你的明堂。

直接入主题,既然要下载,首先得请求,请求成功之后进行回调,这就是一个异步过程,异步回调的时间不可控。

1、首先请求下载。

    public  bool DownLoadFile(DownLoadFileModel file)
    {

        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.1.1:8080/" + file.FileName);        //DownLoadFileModel 为我自己定义的一个实体类,文件名需要带后缀名
            file.request = request;//实体类中将http的请求信息也带进去了,方便回调中的判断
            request.BeginGetResponse(new AsyncCallback(ResponseCallbackDownLoad), file);
            //ResponseCallbackDownLoad请求成功后的回调方法
            return true;
        }
        catch
        {
            return false;
        }
    }

  2、请求成功之后就会去调用ResponseCallbackDownLoad方法,这个方法是异步的,是在子线程里执行,如果在消息者模式下在这个回调里面发送监听到主线程,再操作GameObject对象就会报错,或者直接调用主线程的GameObject也会报错,至于怎么去获取这个下载的信息并操作界面,我想这个我想我就不用多说了。不多说了,上回调代码,回调代码是在子线程里执行。

 private  void ResponseCallbackDownLoad(IAsyncResult ar)
    {
        //throw new NotImplementedException();
        try
        {
            object req = ar.AsyncState as object;;
            if (req == null) return;
            DownLoadFileModel file = ar.AsyncState as DownLoadFileModel;//获取异步下载的请求的相关信息,以便判断
            HttpWebResponse response = file.request.EndGetResponse(ar) as HttpWebResponse;
            if (response.StatusCode != HttpStatusCode.OK)
            {
                response.Close();
                return;
            }
            Stream outStream;
            Stream inStream = response.GetResponseStream();

            byte[] b = new byte[1024];
            FileInfo fi = new FileInfo(Application.persistentDataPath+ "//" + file.SaveName);
            if (fi.Exists)
            {
             //TODO如果文件件存在,TODO
            }
            else  //else如果该文件不存在
            {
                try
                {
                    int readCount = inStream.Read(b, 0, b.Length);
                    outStream = fi.Create();
                    long fileLength = response.ContentLength;//获取文件总长度
                    long fileSize = 0;//已下载的文件长度
                    while (readCount > 0)
                    {
                        outStream.Write(b, 0, readCount);
                        fileSize += readCount;
                        int progress = (int)(((float)fileSize / (float)fileLength) * 100);//progress 为计算下载的百分比
                        readCount = inStream.Read(b, 0, b.Length);
                    }
                    outStream.Close();
                    inStream.Close();
                    response.Close();
                    }
                }

                catch (Exception ex)
                {
                }
            }

        }
        catch (Exception ex)
        {

            Debug.Log("文件下载失败" + ex.Message);
        }
    }
}

  

时间: 2024-08-29 11:02:22

unity下载文件三(http异步下载)的相关文章

php下载文件 强制任意文件格式下载

用php下载一些文件,一般就是为了隐藏文件的真实下载地址才需要这样,否则这样会增加服务器负担,不如直接提供软件的地址. 一个简单的php文件下载源代码,虽不支持断点续传等,但是可以满足一些常用的需求了.php下载文件其实用一个a标签就能实现,比如 <a href="web/magento-1.8.1.0.zip">magento-1.8.1.0.zip</a> .但是遇到一些浏览器能识别的格式,比如.txt,.html,.pdf等,再用<a href=&q

winform自动更新并实现文件的批量异步下载

public partial class update : Form    {        private WebClient client;        int downfilenum = 0; //已下载文件数        int downlistnum = 0;//总下载文件数        List<string> list;        private string URl;        private string fileName;        private con

多线程下载文件,以及断点下载

一:前言 多线程下载文件,可能有的同学没有过多的听说过,但是断点下载肯定是听过的,也就是说像讯雷,哪怕你把电脑重启了,讯雷重新启动后也会接着原来的地方下载,那么这是怎么做到的呢? 二:代码示例 直接给出代码, 2.1.经典代码 两行经典的代码分别为: //设置下载的开始及结束位置 conn.setRequestProperty("Range", "bytes="+start+"-"+end+""); //设置读写的起点位置 R

调用系统下载服务下载文件。监听下载完成拿到downloadid和filename

public class DownLoadAPK { @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static long downloadAPK(DownloadManager downloadManager, String apkUrl, String name, String desc){ DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apk

解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题

最近做项目,采用Spring MVC做控制层,下载文件的文件名总是在主流浏览器上显示乱码,Firfox不是乱码了,IE下又成了乱码.也是烦,IE总是独树一帜,没办法,只能让程序去适应,在网上也搜索了很多,但是解决的不理想,主要是IE11作为主流浏览器后,很多人之前提出的方案都失效了. 简单来说,之前使用request获取header中的user-agent,通过MSIE关键字来判断是否是IE浏览器,如果是IE浏览器,使用utf-8对文件名编码就可以了.然而,IE11的user-agent已经没有

asp.net中用FileStream类实现下载文件功能,自定义下载路径,像IE下载一样

方法一: //这个值可以从配置文件读取,或者放个textbox让用户填 string path = "你的路径";FileStream outputStream = new FileStream(path , FileMode.Create); 方法二: 直接用Response内置对象把文件以流的形式传到前端,浏览器自动就会识别下载了

JavaWeb中的文件上传和下载功能的内容就这么多

一.开发环境搭建 创建一个FileUploadAndDownLoad项目,加入Apache的commons-fileupload文件上传组件的相关Jar包,如下图所示: 二.实现文件上传 2.1.文件上传页面和消息提示页面 upload.jsp页面的代码如下: 1<%@ page language="java" pageEncoding="UTF-8"%> 2<!DOCTYPE HTML> 3<html> 4<head>

Http 下载文件,指定下载位置

HTTP协议简介 下载文件是电脑与WEB服务器交互的过程,它们交互的"语言"的专业名称是协议.传送文件的协议有多种,最常用的是HTTP(超文本传输协议)和FTP(文件传送协议),我采用的是HTTP. HTTP协议最基本的命令只有三条:Get.Post和Head.Get从WEB服务器请求一个特定的对象,比如HTML页面或者一个文件,WEB 服务器通过一个Socket连接发送此对象作为响应:Head命令使服务器给出此对象的基本描述,比如对象的类型.大小和更新时间.Post命令用于向 WEB

通过Java WebService接口从服务端下载文件

一. 前言 本文讲述如何通过webservice接口,从服务端下载文件.报告到客户端.适用于跨系统间的文件交互,传输文件不大的情况(控制在几百M以内).对于这种情况搭建一个FTP环境,增加了系统部署的复杂度和系统对外暴露的接口.通过在服务端读取文件,返回字节流到客户端的方式比较简单. 下面采用restful的接口形式,满足SOA架构接口要求.如下代码拷贝到eclipse中即可运行,功能自测试运行正常.样例代码的服务端和客户端在同一台PC上运行,放到不同PC上运行改一下发布服务和请求服务的IP地址