日期:2014-05-17 浏览次数:20668 次
在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"]; };