日期:2014-05-17  浏览次数:20682 次

Windowsphone7下载文件的方法

在wp7中下载文件有多种方法,例如使用HttpWebRequest,使用WebClient方法,甚至还可以利用后台进程来下载文件;如果是wp支持的图片等文件,还可以通过控件直接绑定数据源来实现自动下载。

使用WebClient的方法可以参考这个比较好的例子:http://www.cnblogs.com/linzheng/archive/2011/11/03/2234971.html

利用后台进程来上传和下载文件的例子:http://www.cnblogs.com/webabcd/archive/2012/07/16/2592989.html

如果是图片,可以通过直接绑定远程uri来实现自动下载并在完成系在后显示,例如: 

<Image Source="http://xxx.com/xxx/remoteImage.png" Stretch="None" />

如果想在图片下载完成之前显示一张默认的图片,下载完成后再更新图片,那么可以通过监听这个完成下载这个事件。那怎么实现呢,可以参考以下代码:

                BitmapImage bitmap = new BitmapImage();
                bitmap.CreateOptions = BitmapCreateOptions.None;
                // 当图片下载完成并解码成功时,会触发ImageOpened
                bitmap.ImageOpened += (s, e) =>
                {
                    // 将图片显示在控件UserHeadImage中,该控件在xaml中已定义
                    UserHeadImage.Source = s as BitmapImage;
                };
                // uri为远程文件地址
                bitmap.UriSource = new Uri(uri); 
最后一个值得思考的地方是,客户端可能实现文件缓存机制,想知道网络文件是不是已经被更改过了,只有被更改过了客户端才有必要去下载下来,否则就而避免了重复下载带来的流量浪费。一个解决方法时,在下载文件之前先发一个简单的请求,请求服务端发回该文件的最后修改时间等信息。同时客户端会保存该文件的上一次更新时间,然后两个时间拿来对比,如果服务器的时间较新,那么就下载;否则就继续使用本地缓存的文件。这模仿了浏览器加载页面的技术。

以下是发送WebClient请求并在服务器返回的header信息中获取文件最后修改时间的方法:

WebClient request = new WebClient();
 request.OpenReadAsync(new Uri(url));
 request.OpenReadCompleted += (s, e) =>
 {
     string lastModifiedDate = request.ResponseHeaders["Last-Modified"];
 };