silverlight漂亮的文件上传进度显示原理及示例
silverlight漂亮的文件上传进度显示原理及示例
作者:chenxumi 出处:博客园 2009/11/27 13:37:11 阅读 1219 次
概述:在网站根目录web.config里配置上传文件夹,注意:folder的value要写成windows资源管理器形式例如: upload\audio\chenxumi,而且是相对网站根目录而言。因为这里是分块上传的每块大小为4MB。
为了节省大家时间,先看怎么使用,最后再贴代码:
截图如下:
我把这个功能做成了一个控件,大家直接在要用的页面调用就行KeyTime的value就可以,具体怎么做,给大家推荐一个视频,
本来要贴视频地址的,但是silverlight.net网站打开的慢如蜗牛,大家有机会上去看看,有个动态改变keyframe的
value的一个动画
<%@ Register Src="~/SLUpload/SLUpload.ascx" TagName="Upload" TagPrefix="u"%>
<u:Upload runat=server ></u:Upload>
在网站根目录web.config里配置上传文件夹,注意:folder的value要写成windows资源管理器形式例如:
upload\audio\chenxumi,而且是相对网站根目录而言。因为这里是分块上传的每块大小为4MB。所以maxRequestLength设为4100kb,至于为什么不是4096kb是因为上传时还附带了很多其他信息,例如当前文件的文件名、文件是否为第一次上传、文件是否是最后一块上传、文件此时的偏移量等信息,显然这种最大上传限制很有弹性,比起传统的一次性上传大小设置更有活性。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="SLUpload" type="System.Configuration.NameValueSectionHandler"/>
</configSections>
<SLUpload>
<add key="folder" value="upload"/>
</SLUpload>
<system.web>
<httpRuntime maxRequestLength="4050"/>
<compilation debug="true"/></system.web>
</configuration>
大家测试时有可能会出现文件无法上传的现象,这是在服务器后面又加别名导致FileReceive.ashx的路径错误。
从IIS里打开就可以解决这个问题。
文件下载地址:
http://files.cnblogs.com/chenxumi/sl.rar
这个程序的界面设计用的是Blend,只需改变
程序设计方面其实很简单,大家知道原理就行,把文件分成4mb大小的块,在发送一次文件时除发送文件的
本身数据流外,还得发送其他附加信息,例如文件名、文件此时的偏移量、是否是最后还是第一次到达,然后后台
接受文件的程序再根据这些信息先生成一个临时文件,如果此时文件存在则会删除文件,如果此时发送的文件是
最后一块时就将临时文件转移到目标文件夹中也就是web.config里配置的文件夹里。
这里还有个小问题大家注意,因为从服务器返回的响应和主程序是异步的,所以当返回后是不能调用主线程的,即不能
修改文件上传的界面,所以这里用到了线程的队列服务这个类 Dispatcher 具体代码请见如下:
public Dispatcher UIDispatcher;
while (--)
{
requestStream.Write(buffer, 0, bytesRead);
requestStream.Flush(); send += bytesRead;
tempTotal += bytesRead;
this.UIDispatcher.BeginInvoke(delegate()
{
OnProgressChanged();
});
}
文件选定、文件发送、以及服务器回调函数、以及进度变化都是些很简单的方法,大家看看就行了
private void btnUpLoad_Click(object sender, System.Windows.RoutedEventArgs e)
{ OpenFileDialog dialog = new OpenFileDialog()
{
Filter = "all files|*.*",
Multiselect = false
};
if ((bool)dialog.ShowDialog())
{
send = 0;
data = dialog.File.OpenRead();
filename = dialog.File.Name;
UIDispatcher = this.Dispatcher;
this.UIDispatcher.BeginInvoke(delegate()
{
if (keyframe_rect.Value.Equals(270))
{
keyframe_rect.Value = -270;
txbPrecent.Text = "0%";
keyframe_rect.KeyTime = System.Windows.Media.Animation.KeyTime.FromTimeSpan(TimeSpan.Zero);
Storyboard1.Begin();
}
});
StartUpload();
}
}
private void StartUpload()
{
double dataToSend = data.Length - send;
bool isLastChunk = dataToSend <= ChunkSize;
bool isFirstChunk = send == 0; UriBuilder httpHandlerUrlBuilder = new UriBuilder(new Uri(this.url, UriKind.Absolute));
httpHandlerUrlBuilder.Query = string.Format("{5}file={0}&offset={1}&last={2}&first={3}¶m={4}", filename, send, isLastChunk, isFirstChunk, "", string.IsNullOrEmpty(httpHandlerUrlBuilder.Query) ? "" : httpHandlerUrlBuilder.Query.Remove(0, 1) + "&"); HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(httpHandlerUrlBuilder.Uri);
webRequest.Method = "POST";
webRequest.BeginGetRequestStream(new AsyncCallback(WriteToStreamCallback), webRequest); } private void WriteToStreamCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
Stream requestStream = webRequest.EndGetRequestStream(asynchronousResult); byte[] buffer = new Byte[4096];
int bytesRead = 0;
int tempTotal = 0; while (tempTotal + bytesRead < ChunkSize && (bytesRead = data.Read(buffer, 0, buffer.Length)) != 0
)
{
requestStream.Write(buffer, 0, bytesRead);
requestStream.Flush(); send += bytesRead;
tempTotal += bytesRead;
this.UIDispatcher.BeginInvoke(delegate()
{
OnProgressChanged();
});
} requestStream.Close();
webRequest.BeginGetResponse(new AsyncCallback(ReadHttpResponseCallback), webRequest); } private void ReadHttpResponseCallback(IAsyncResult asynchronousResult)
{ HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
StreamReader reader = new StreamReader(webResponse.GetResponseStream()); string responsestring = reader.ReadToEnd();
reader.Close(); if (send < data.Length)
{
StartUpload();
}
else
{
data.Close();
data.Dispose();
}
} private void OnProgressChanged()
{
double progress = send / (double)(data.Length);
keyframe_rect.Value = (double)progress * 270;
txbPrecent.Text = (send / 1024 / 1024).ToString("0.0").Replace(".0", "") + "MB " + (progress * 100).ToString("0.0").Replace(".0", "") + "%";
Storyboard1.Begin();
}
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果
转载请注明:文章转载自:慧都控件网 [http://www.evget.com/]
本文地址:http://www.evget.com/zh-CN/info/catalog/13498.html
silverlight漂亮的文件上传进度显示原理及示例的更多相关文章
- servlet上传文件+上传进度显示
效果图 功能描述 1.使用jquery.form.js实现异步上传功能,并显示上传进度 2.servlet中保存上传的文件到指定文件夹 3.查看已经上传的文件 4.不同文件类型用不同图标显示 下载 h ...
- 阿里云 oss 小文件上传进度显示
对阿里云OSS上传小文件时的进度,想过两个方法:一是.通过多线程监測Inputstream剩余的字节数来计算,可是由于Inputstream在两个线程中共用,假设上传线程将Inputstream关闭, ...
- Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)
Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...
- 【原创】用JAVA实现大文件上传及显示进度信息
用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...
- 使用element UI el-upload组件实现视频文件上传及上传进度显示方法总结
实现效果: 上传中: 上传完成: 代码: <el-form-item label="视频上传" prop="Video"> <!-- acti ...
- HTML5矢量实现文件上传进度条
在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...
- 基于HT for Web矢量实现HTML5文件上传进度条
在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...
- PHP中使用Session配合Javascript实现文件上传进度条功能
Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP .4以前,实现这样的进度条并不容易 ...
- Web---文件上传-用apache的工具处理、打散目录、简单文件上传进度
我们需要先准备好2个apache的类: 上一个博客文章只讲了最简单的入门,现在来开始慢慢加深. 先过渡一下:只上传一个file项 index.jsp: <h2>用apache的工具处理文件 ...
随机推荐
- python011 Python3 字典
Python3 字典字典是另一种可变容器模型,且可存储任意类型对象.字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如 ...
- Leetcode 309.最佳买卖股票时机含冷冻期
最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格. 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不 ...
- irules事件和命令
- [codevs2495]水叮当的舞步
[codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...
- [luoguP1273] 有线电视网(DP)
传送门 f[i][j]表示节点i选j个用户的最大收益 #include <cstdio> #include <cstring> #include <iostream> ...
- 积累js中的一些问题及解决方案
一.取字符串的第i位不兼容的问题 1.问题:对于字符串str来说,要获取第i位,常见的是str[i],但是在低版本的浏览器中不兼容,例如ie7. 2.解决:使用str.charAt(i); 二.使用定 ...
- 【搜索引擎】SOLR VS Elasticsearch(2019技术选型参考)
SOLR是什么 (官方的解释) Solr是基于Apache Lucene构建的流行的.快速的.开源的企业搜索平台. Solr也是高度可靠.可伸缩和容错的,提供分布式索引.复制和负载平衡查询.自动故障转 ...
- Intersection--poj1410(判断线段与矩形的关系)
http://poj.org/problem?id=1410 题目大意:给你一个线段和矩形的对角两点 如果相交就输出'T' 不想交就是'F' 注意: 1,给的矩形有可能不是左上 右下 所以要先判 ...
- 中间件序列TDATASET为BUFFER演示代码
procedure SendStream(const AStream: TStream);var Buffer: array[0..4095] of Byte; // 每包最大4K StartPos, ...
- Visual Studio VS如何拷贝一个项目的窗体文件到另一个项目
1 比如下我有一个项目,我要把这个Config整个窗体和代码拷贝到另一个项目 2 在新项目中添加现有项,然后把这个窗体相关的三个文件都添加到新的项目中 3 然后在新窗体中就什么都有了 ...