课参考
http://www.unsbiz.com/
Create PROCEDURE [dbo].[flyso_ListPage]
(
--FLYSO Blog
@tblName nvarchar(200), ----要显示的表或多个表的连接
@fldName nvarchar(500) = '*', ----要显示的字段列表
@pageSize int = 1, ----每页显示的记录个数
@page int = 10, ----要显示那一页的记录
@pageCount int = 1 output, ----查询结果分页后的总页数
@Counts int = 1 output, ----查询到的记录数
@fldSort nvarchar(200) = null, ----排序字段列表或条件
@Sort bit = 1, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
@strCondition nvarchar(1000) = null, ----查询条件,不需where
@ID nvarchar(150), ----主表的主键
@Dist bit = 0 ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
)
AS
SET NOCOUNT ON
Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句
Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句
Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句
Declare @strSortType nvarchar(10) ----数据排序规则A
Declare @strFSortType nvarchar(10) ----数据排序规则B
Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造
Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造
if @Dist = 0
begin
set @SqlSelect = 'select '
set @SqlCounts = 'Count(*)'
end
else
begin
set @SqlSelect = 'select distinct '
set @SqlCounts = 'Count(DISTINCT '+@ID+')'
end
if @Sort=0
begin
set @strFSortType=' ASC '
set @strSortType=' DESC '
end
else
begin
set @strFSortType=' DESC '
set @strSortType=' ASC '
end
--------生成查询语句--------
--此处@strTmp为取得查询结果数量的语句
if @strCondition is null or @strCondition='' --没有设置显示条件
begin
set @sqlTmp = @fldName + ' From ' + @tblName
set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName
set @strID = ' From ' + @tblName
end
else
begin
set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition
set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition
set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition
end
----取得查询结果总数量-----
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
declare @tmpCounts int
if @Counts = 0
set @tmpCounts = 1
else
set @tmpCounts = @Counts
--取得分页总数
set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize
/**//**当前页大于总页数 取最后一页**/
if @page>@pageCount
set @page=@pageCount
--/*-----数据分页2分处理-------*/
declare @pageIndex int --总数/页大小
declare @lastcount int --总数%页大小
set @pageIndex = @tmpCounts/@pageSize
set @lastcount = @tmpCounts%@pageSize
if @lastcount > 0
set @pageIndex = @pageIndex + 1
else
set @lastcount = @pagesize
--//***显示分页
if @strCondition is null or @strCondition='' --没有设置显示条件
begin
if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理
begin
set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName
+' order by '+ @fldSort +' '+ @strFSortType+')'
+' order by '+ @fldSort +' '+ @strFSortType
end
else
begin
set @page = @pageIndex-@page+1 --后半部分数据处理
if @page <= 1 --最后一页数据显示
set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType
else
set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
+' order by '+ @fldSort +' '+ @strSortType+')'
+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType
end
end
else --有查询条件
begin
if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理
begin
set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName +' from '+@tblName
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName
+' Where (1>0) ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType+')'
+' ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType
end
else
begin
set @page = @pageIndex-@page+1 --后半部分数据处理
if @page <= 1 --最后一页数据显示
set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
+' where (1>0) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType
else
set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
+' where (1>0) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+')'
+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType
end
end
------返回查询结果-----
exec sp_executesql @strTmp
--print @strTmp
SET NOCOUNT OFF
原始的Joseph问题的描述如下:
有n个人围坐在一个圆桌周围,把这n个人依次编号为1,......,n。从编号是1 的人开始报数,
数到m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,......,
如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
现在的问题是:假设有k个好人和k个坏人。好人的编号是1到k,坏人的编号是k+1到2k。
我们希望求出m的最小值,使得最先出列的k个人都是坏人。
输入:
仅有的一个数字是k
输出:
使得最先出列的k个人都是坏人的m的最小值。
<---------这道题直接翻译,结果如下:------------->
import java.util.*;
class ShiTi
{
public ShiTi()
{
}
public ShiTi(int size)
{
this.size=size;
}
public void initNum()
{
array=new LinkedList();
temp=new LinkedList();
for(int i=1;i<=size;i++)
{
array.add(new Integer(i));
}
}
public void initPerson()
{
array=new java.util.LinkedList();
temp = new LinkedList();
for(int i=0;i<size;i++)
{
array.add(new Boolean(true));
}
for(int i=0;i<size;i++)
{
array.add(new Boolean(false));
}
}
private boolean bool(Object o)
{
if(temp.size()==size)
{
System.out.println("temp.size:"+temp.size());
status=true;
return false;
}
if(((Boolean)o).booleanValue()==true)
{
return false;
}
else
return true;
}
public void searches(int start,int _span,boolean b)//start开始值为1
{
if(array.size()>0 && b)
{
if((start+_span-1)>array.size())
{
int leave=array.size()-start+1;//剩几个
int n=(_span-leave)-(_span-leave)/array.size()*array.size();//最后一遍取几个
int start_temp=0;
if(n==0)
{
start_temp=array.size();
}
else
{
start_temp=n;
}
boolean bl=this.bool(array.get(start_temp-1));
if(bl)
{
temp.add(array.get(start_temp-1));
array.remove(start_temp-1);
searches(start_temp,_span,bl);
}
}
else
{
boolean bl=this.bool(array.get((start-1)+(_span-1)));
if(bl)
{
temp.add(array.get((start-1)+(_span-1)));
array.remove((start-1)+(_span-1));
searches(start+_span-1,_span,bl);
}
}
}
else
return;
}
public void searchesPerson()
{
while(!status)
{
initPerson();
this.searches(1,span,true);
if(status != true)
{
span++;
}
else
return;
}
}
//数字按指定步长排列
public void searches(int start,int _span)//start开始值为1
{
if(array.size()>0)
{
if((start+_span-1)>array.size())
{
int leave=array.size()-start+1;//剩几个
int n=(_span-leave)-(_span-leave)/array.size()*array.size();//最后一遍取几个
int start_temp=0;
if(n==0)
{
start_temp=array.size();
}
else
{
start_temp=n;
}
temp.add(array.get(start_temp-1));
array.remove(start_temp-1);
searches(start_temp,_span);
}
else
{
temp.add(array.get((start-1)+(_span-1)));
array.remove((start-1)+(_span-1));
searches(start+_span-1,_span);
}
}
else
return;
}
public void printResult()
{
System.out.println("输入:"+size);
System.out.print("结果:");
for(int i=0;i<temp.size();i++)
{
System.out.print(temp.get(i).toString()+",");
}
System.out.println("");
if(status)
System.out.println("输出:最小步长为 "+span+" 可提出所有坏人");
System.out.println("");
}
java.util.LinkedList array=null;
java.util.LinkedList temp=null;
java.util.LinkedList result=new LinkedList();
private int size=0;
private int span=1;
private boolean status=false;
}
class Excute
{
public static void main(String[] args)
{
ShiTi s = new ShiTi(6);//1-13可以试,14和14以上的就不要试 了,
s.initNum();
s.searches(1,5);
s.printResult();
s.searchesPerson();
s.printResult();
}
}
<----------------算法优化---------------->
public class Joseph4 {
long k = 0;
long m = 0;
long begin = 0;
public int check(long remain) {
long result = (begin + m - 1) % remain; //开始报数,但是一定要找到报数点
// System.out.println(m);
if (result >= k) {//出列的人的报数必须不小于k值,才能保证是坏人
begin = result;
return 1;
}
else {
return 0;
}
}
public void find() {
long i, find = 0;
k = 14;
for (m = k; find == 0; m++) {
find = 1;
begin = 0;
for (i = 0; i < k; i++) {
//若check(2*k-i)==1为真,证明为坏人,向下继续出列,
//若为0,证明不是坏人,则退出,使m加1
if (check(2 * k - i) == 0) {
find = 0;
break;
}
}
}
System.out.println("m: " + (m - 1));
}
public static void main(String[] args) {
Joseph4 joseph=new Joseph4();
joseph.find();
}
}
运算
19链接表和数组之间的区别是什么?
20做一个链接表,你为什么要选择这样的方法?
21选择一种算法来整理出一个链接表。你为什么要选择这种方法?现在用o(n)时间来做。
22说说各种股票分类算法的优点和缺点。
23用一种算法来颠倒一个链接表的顺序。现在在不用递归式的情况下做一遍。
24用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表。
25用一种算法整理一个数组。你为什么选择这种方法?
26用一种算法使通用字符串相匹配。
27颠倒一个字符串。优化速度。优化空间。
28颠倒一个句子中的词的顺序,比如将“我叫克丽丝”转换为“克丽丝叫我”,实现速度最快,移动最少。
29找到一个子字符串。优化速度。优化空间。
30比较两个字符串,用o(n)时间和恒量空间。
31假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?
32不用乘法或加法增加8倍。现在用同样的方法增加7倍。
应用
33如何将计算机技术应用于一幢100层高的办公大楼的电梯系统上?你怎样优化这种应用?工作日时的交通、楼层或时间等因素会对此产生怎样的影响?
34你如何对一种可以随时存在文件中或从因特网上拷贝下来的操作系统实施保护措施,
防止被非法复制?
35你如何重新设计自动取款机?
36假设我们想通过电脑来操作一台微波炉,你会开发什么样的软件来完成这个任务?
37你如何为一辆汽车设计一台咖啡机?
38如果你想给微软的word系统增加点内容,你会增加什么样的内容?
39你会给只有一只手的用户设计什么样的键盘?
头脑
41如果你有一个许多部件可以拆卸的时钟,你将它一块块拆开,但是没有记住是怎样拆的。然后你将各个零件重新组装起来,最后发现有三个重要零件没有放进去。这时你如何重新组装这个时钟?
43假设由你负责设计比尔•盖茨的卫生间。当然,钱不成问题,但是你不可以和比尔谈。你会怎样做?
45如果微软公司说,我们愿意投资500万美元用来开发你提出的方案。那么你会做什么?为什么?
46如果你将世界上所有的计算机制造商召集起来,告诉他们必须要做一件事,你会让他们做什么事?
47如果你在五年内会得到一笔奖金,你认为会是因为什么?关注你的成绩的人会是谁?
62.元帅领兵
元帅统领八员将,每将各分八个营,每营里面摆八阵,每阵配置八先锋,每个先锋八旗头,每个旗头有八队,每队分设八个组,每组带领八个兵。请你掐指算一算,元师共有多少兵?
63.运算符号的妙用
在1、2、3、4、5、6、7、8、9这一串数字中间,加入运算符号“+”或“-”,使其代数和等于99,按(1 …… 9)可以有17种解,倒过来的后者(9 …… 1)可以有11种解。有兴趣的读者,不妨一试。
64.两龟赛跑
有两只乌龟一起赛跑。甲龟到达10米终点线时,乙龟才跑到9米。现在如果让甲龟的起跑线退后1米,这时两龟再同时起跑比赛,问甲、乙两龟是否同时到达终点?
65.电视机的价格
麦克因工作繁忙,决定临时请尼克来协助他工作。规定以一年为期限,一年的报酬为600美元与一台电视机。
可是尼克做了7个月后,因急事必须离开麦克,并要求麦克付给他应得的钱和电视机。由于电视机不能拆散付给他,结果尼克得到了150美元和一台电视机。
现在请你想一想:这台电视机值多少钱?
66.这块石头究竟有多重
有4个小孩看见一块石头正沿着山坡滚下来,便议论开了。
“我看这块石头有17公斤重,”第一个孩子说。
“我说它有26公斤,”第二个孩子不同意地说。
“我看它重21公斤”,第三个孩子说。
“你们都说得不对,我看它的正确重量是20公斤,”第四个孩子争着说。
他们四人争得面红耳赤,谁也不服谁。最后他们把石头拿去称了一下,结果谁也没猜准。其中一个人所猜的重量与石头的正确重量相差2公斤,另外两个人所猜的重量与石头的正确重量之差相同。当然,这里所指的差,不考虑正负号,取绝对值。请问这块石头究竟有多重?
20、对一批编号为1~100 全部开关朝上开的灯进行以下操作: 凡是1 的倍数反方向拨一次开关2 的倍数反方向又拨一次开关3 的倍数反方向又拨一次开关。问最后为关熄状态的灯的编号。
21、假设一张圆盘像唱机上的唱盘那样转动。这张盘一半是黑色,一半是白色。假设你有数量不限的一些颜色传感器。要想确定圆盘转动的方向,你需要在它周围摆多少个颜色传感器?它们应该被摆放在什么位置?
22、假设时钟到了12点。注意时针和分针重叠在一起。在一天之中,时针和分针共重叠多少次?你知道它们重叠时的具体时间吗?
23、中间只隔一个数字的两个奇数被称为奇数对,比如17和19。证明奇数对之间的数字总能被6整除(假设这两个奇数都大于6)。现在证明没有由三个奇数组成的奇数对。
24、一个屋子有一个门(门是关闭的)和3盏电灯。屋外有3个开关,分别与这3盏灯相连。你可以随意操纵这些开关,可一旦你将门打开,就不能变换开关了。确定每个开关具体管哪盏灯。
25、假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比。最少要称多少次才能找出这个较重的球?
26、下面玩一个拆字游戏,所有字母的顺序都被打乱。你要判断这个字是什么。假设这个被拆开的字由5个字母组成:
1.共有多少种可能的组合方式?
2.如果我们知道是哪5个字母,那会怎么样?
3.找出一种解决这个问题的方法。
27、有4个女人要过一座桥。她们都站在桥的某一边,要让她们在17分钟内全部通过这座桥。这时是晚上。她们只有一个手电筒。最多只能让两个人同时过桥。不管是谁过桥,不管是一个人还是两个人,必须要带着手电筒。手电筒必须要传来传去,不能扔过去。每个女人过桥的速度不同,两个人的速度必须以较慢的那个人的速度过桥。
第一个女人:过桥需要1分钟;
第二个女人:过桥需要2分钟;
第三个女人:过桥需要5分钟;
第四个女人:过桥需要10分钟。
比如,如果第一个女人与第4个女人首先过桥,等她们过去时,已经过去了10分钟。如果让第4个女人将手电筒送回去,那么等她到达桥的另一端时,总共用去了20分钟,行动也就失败了。怎样让这4个女人在17分钟内过桥?还有别的什么方法?
28、如果你有两个桶,一个装的是红色的颜料,另一个装的是蓝色的颜料。你从蓝色颜料桶里舀一杯,倒入红色颜料桶,再从红色颜料桶里舀一杯倒入蓝颜料桶。两个桶中红蓝颜料的比例哪个更高?通过算术的方式来证明这一点。
B:疯狂计算
29、已知两个1~30之间的数字,甲知道两数之和,乙知道两数之积。
甲问乙:你知道是哪两个数吗?乙说:不知道;
乙问甲:你知道是哪两个数吗?甲说:也不知道;
于是,乙说:那我知道了;
随后甲也说:那我也知道了;
这两个数是什么?
30、4,4,10,10,加减乘除,怎么出24点?
31、1000!有几位数,为什么?
32、F(n)=1 n>8 n<12
F(n)=2 n<2
F(n)=3 n=6
F(n)=4 n=other
使用+ - * /和sign(n)函数组合出F(n)函数
sign(n)=0 n=0
sign(n)=-1 n<0
sign(n)=1 n>0
33、编一个程序求质数的和例如F(7)=1+3+5+7+11+13+17=58
34、请仅用一支笔画四根直线将上图9 各点全部连接
35、三层四层二叉树有多少种
36、1--100000 数列按一定顺序排列,有一个数字排错,如何纠错?写出最好方法。两个数字呢?
37、链接表和数组之间的区别是什么?
38、做一个链接表,你为什么要选择这样的方法?
39、选择一种算法来整理出一个链接表。你为什么要选择这种方法?现在用O(n)时间来做。
40、说说各种股票分类算法的优点和缺点。
41、用一种算法来颠倒一个链接表的顺序。现在在不用递归式的情况下做一遍。
42、用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表。
43、用一种算法整理一个数组。你为什么选择这种方法?
44、用一种算法使通用字符串相匹配。
45、颠倒一个字符串,优化速度,优化空间。
46、颠倒一个句子中的词的顺序,比如将我叫克丽丝转换为克丽丝叫我,实现速度最快,移动最少。
47、找到一个子字符串,优化速度,优化空间。
48、比较两个字符串,用O(n)时间和恒量空间。
49、假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?
50、不用乘法或加法增加8倍。现在用同样的方法增加7倍。
strong是web标准中xhtml的标签,strong的意思是“强调”;b是html的,b的意思是bold(粗体)。为什么用strong代替b?其实这个问题不妨改问:xhtml和html有什么不同,为什么要用xhtml代替html?
网上有很多详细的文章谈这个,可以找了看看
简单地说:web标准主张xhtml不涉及具体的表现形式,“强调”可以用加粗来强调,也可以用其它方式来强调,比如下划线,比如字体加大,比如红色,等等,可以通过css来改变strong的具体表现,这就是为什么b要改为strong
strong 代表其中内容文字的意义。b代表其中文字的样式是粗体。 在html规范中二者的区别基本上看不出来。在xhtml中由于强调“样式与内容的分离”所以代 表样式的b被掏汰了。取而代之的是其它标签。注意,不是strong代替了b。strong代表强调,你可以自定义任何样式来代表强调。只是strong 的默认样式与b相同而已。
是加重语气标签;是粗体标签
它们起的均是加粗字体的作用。在大多数情况下,它们表现出来的效果也大致相同,所不同的是,标签是一个实体标签,它所包围的字符将被设为bold(粗体),而标签是一个逻辑标签,它的作用是加强字符的语气,一般来说,加强字符的语气是通过将字符变为bold (粗体)来实现的。但是在不同的HTML解释器下,情况也可能有所不同。
同样的一段代码,在Internet Explorer和Netscape中显示有可能不同,因为这两个标签涉及浏览器的兼容性的问题。在Netscape中,如果将字符集设为GB2312的话,和是不起作用的。要解决这个问题,我们可以将字符集改为885981,也就是将〈meta>标签所在行改为:
然后在Netscape中打开,两个标签就都起作用了!
忠告:在实际网页设计中,为使页面效果受客户端因素影响变为最小,应该尽量使用实体标签!
C#文件上传
--------------------------------------------------------------------------------
2007-07-29 15:53:21 标签:文件 上传 C# [推送到技术圈]
找了很多的资料,学到了不少有用的东西,最简单的实现就是使用FileUpload控件.
using System;
namespace UpFile { ///
/// upfile 的摘要说明。
///
public class upfile
{
private string path = null;
private string fileType = null;
private int sizes = 0;
///
/// 初始化变量
///
public upfile()
{
path = @"\uploadimages\"; //上传路径
fileType = "jpg|gif|bmp";
sizes = 200; //传文件的大小,默认200KB
}
///
/// 设置上传路径,如:uploadimages\
///
public string Path
{
set
{
path = @"\" + value + @"\";
}
}
///
/// 设置上传文件大小,单位为KB
///
public int Sizes
{
set
{
sizes = value * 1024;
}
}
///
/// 设置上传文件的类型,如:jpg|gif|bmp ///
public string FileType
{
set
{
fileType = value;
}
}
///
/// 上传图片
///
/// 上传控件名称
/// true则以当前时间创建文件夹,false则为设置的文件夹
/// 返回上传图片的相对路径
public string fileSaveAs(System.Web.UI.HtmlControls.HtmlInputFile name,bool creatDirectory)
{
try
{
string filePath=null;
//以当前时间修改图片的名字或创建文件夹的名字
string modifyFileName = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString();
//获得站点的物理路径
string uploadFilePath = null;
//如果为true则以当前时间创建文件夹,否则为设置的文件夹
if(creatDirectory)
{
uploadFilePath = System.Web.HttpContext.Current.Server.MapPath(".") + @"\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + @"\";
}
else
{
uploadFilePath = System.Web.HttpContext.Current.Server.MapPath(".") + path;
}
//获得文件的上传的路径
string sourcePath=name.Value.Trim();
//判断上传文件是否为空
if(sourcePath == "" || sourcePath == null)
{
message("您没有上传数据呀,是不是搞错了呀!");
return null;
}
//获得文件扩展名
string tFileType = sourcePath.Substring(sourcePath.LastIndexOf(".")+1);
//获得上传文件的大小
long strLen = name.PostedFile.ContentLength;
//分解允许上传文件的格式
string[] temp = fileType.Split('|');
//设置上传的文件是否是允许的格式
bool flag = false;
//判断上传文件大小
if(strLen >= sizes)
{
message("上传的图片不能大于" + sizes + "KB");
return null;
}
//判断上传的文件是否是允许的格式
foreach(string data in temp)
{
if(data == tFileType)
{
flag = true ;
break;
}
}
//如果为真允许上传,为假则不允许上传
if(!flag)
{
message("目前本系统支持的格式为:"+fileType);
return null;
}
System.IO.DirectoryInfo dir=new System.IO.DirectoryInfo(uploadFilePath);
//判断文件夹否存在,不存在则创建
if(!dir.Exists)
{
dir.Create();
}
filePath = uploadFilePath + modifyFileName + "." + tFileType;
name.PostedFile.SaveAs(filePath);
filePath = path + modifyFileName + "." + tFileType;
return filePath;
}
catch
{
//异常
message("出现未知错误!");
return null;
}
}
private void message(string msg,string url)
{
System.Web.HttpContext.Current.Response.Write(" alert('"+msg+"');window.location='"+url+"' ");
}
private void message(string msg)
{
System.Web.HttpContext.Current.Response.Write(" alert('"+msg+"'); ");
}
}
}
--------------------------------------------------------------------------------
1. C#实现Web文件的上传
在Web编程中,我们常需要把一些本地文件上传到Web服务器上,上传后,用户可以通过浏览器方便地浏览这些文件,应用十分广泛。
那么使用C#如何实现文件上传的功能呢?下面笔者简要介绍一下。
首先,在你的Visual C# web project 中增加一个上传用的Web Form,为了要上传文件,需要在ToolBox中选择HTML类的File Field控件,将此控件加入到Web Form中,然而此时该控件还不是服务端控件,我们需要为它加上如下一段代码:<INPUT&NBSP;ID=UPLOADFILE1&NBSP;TYPE=FILE&NBSP;SIZE=49&NBSP;RUNAT="SERVER">,这样它就成为服务端控件了,如果需要同时上传数个文件时,我们可以相应增加此控件。
需要注意的是代码中一定要把<form>的属性设置成为:
<form method=post encType=multipart/ form-data runat="server">
如果没有这个属性,就不能实现上传。
然后在此Web Form中增加一个Web Form类的Button,双击Button添加如下代码:
//上传图片的程序段
DateTime now = DateTime.Now ;
//取现在时间到DataTime类的对象now中
string strBaseLocation = "D:\\web\\FC\\pic\\";
//这是文件将上传到的服务器的绝对目录
if (uploadfile1.PostedFile.ContentLength != 0) //判断选取对话框选取的文件长度是否为0
{
uploadfile1.PostedFile.SaveAs(strBaseLocation+now.DayOfYear.ToString()+uploadfile1.PostedFile.ContentLength.ToString()+".jpg");
//执行上传,并自动根据日期和文件大小不同为文件命名,确保不重复
Label1.Text="图片1已经上传,文件名为:"+now.DayOfYear.ToString()+uploadfile1.PostedFile.ContentLength.ToString()+".jpg";
navigator.Insert(System.Xml.TreePosition.After, XmlNodeType.Element,"pic1","","") ;
navigator.Insert(System.Xml.TreePosition.FirstChild, XmlNodeType.Text,"pic1","","") ;
navigator.Value= now.DayOfYear.ToString()+uploadfile1.PostedFile.ContentLength.ToString()+".jpg" ;
navigator.MoveToParent() ;
}
上面的代码用于笔者开发的一个使用XML文件存储新闻信息的系统中,后面几句代码作用是写上传文件信息到XML文件中。如果要上传其他类型文件,只需要将jpg改为相应类型的后缀名即可,如改为doc即可上传Word文件,浏览器即可直接浏览上传的Word文件。
【注意事项】
1. 上传文件不可以无限大;
2. 要注意IIS的安全性方面的配合;
3. 用Visual Studio 的安装项目做安装程序的时候,请注意安装程序所在的绝对路径问题;
4. 注意文件上传后的重名问题。
--------------------------------------------------------------------------------
2. C#实现Web文件的上传
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI.HtmlControls;
using System.Drawing.Imaging;
using System.Configuration;
using System.Drawing;
namespace zhuanti
{
/// <summary>
/// 这是一个用于玩家投稿中实现玩家上传文件功能中用到的相应的函数的功能模块
/// </summary>
public class FileUpload
{
public enum File //定义一个人用于存放玩家上传文件信息的一个数组
{
FILE_SIZE , //大小
FILE_POSTNAME, //类型(文件后缀名)
FILE_SYSNAME , //系统名
FILE_ORGINNAME, //原来的名字
FILE_PATH //文件路径
}
private static Random rnd = new Random(); //获取一个随机数
public static string[] UploadFile(HtmlInputFile file,string Upload_Dir) //实现玩家文件上传功能的主函数
{
string[] arr = new String[5];
string FileName = GetUniquelyString(); //获取一个不重复的文件名
string FileOrginName = file.PostedFile.FileName.Substring
(file.PostedFile.FileName.LastIndexOf("\\")+1);//获取文件的原始名
if(file.PostedFile.ContentLength<=0)
{ return null; }
string postFileName;
string FilePath = Upload_Dir.ToString();
string path = FilePath + "\\";
try
{
int pos = file.PostedFile.FileName.LastIndexOf(".")+1;
postFileName = file.PostedFile.FileName.Substring(pos,file.PostedFile.FileName.Length-pos);
file.PostedFile.SaveAs(path+FileName+"."+postFileName); //存储指定的文件到指定的目录
}
catch(Exception exec)
{
throw(exec);
}
double unit = 1024;
double size = Math.Round(file.PostedFile.ContentLength/unit,2);
arr[(int)File.FILE_SIZE] = size.ToString(); //文件大小
arr[(int)File.FILE_POSTNAME] = postFileName; //文件类型(文件后缀名)
arr[(int)File.FILE_SYSNAME] = FileName; //文件系统名
arr[(int)File.FILE_ORGINNAME] = FileOrginName; //文件原来的名字
arr[(int)File.FILE_PATH]=path+FileName+"."+postFileName; //文件路径
return arr;
}
public static bool OperateDB(string sqlstr) //建立一个和数据库的关联
{
if (sqlstr==String.Empty)
return false;
SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["connstring"]);
SqlCommand myCommand = new SqlCommand(sqlstr, myConnection);
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
return true;
}
public static string GetUniquelyString() //获取一个不重复的文件名
{
const int RANDOM_MAX_VALUE = 1000;
string strTemp,strYear,strMonth,strDay,strHour,strMinute,strSecond,strMillisecond;
DateTime dt =DateTime.Now;
int rndNumber = rnd.Next(RANDOM_MAX_VALUE);
strYear = dt.Year.ToString ();
strMonth = (dt.Month > 9)? dt.Month.ToString() : "0" + dt.Month.ToString();
strDay = (dt.Day > 9)? dt.Day.ToString() : "0" + dt.Day.ToString();
strHour = (dt.Hour > 9)? dt.Hour.ToString() : "0" + dt.Hour.ToString();
strMinute = (dt.Minute > 9)? dt.Minute.ToString() : "0" + dt.Minute.ToString();
strSecond = (dt.Second > 9)? dt.Second.ToString() : "0" + dt.Second.ToString();
strMillisecond = dt.Millisecond.ToString();
strTemp = strYear + strMonth + strDay +"_"+ strHour + strMinute + strSecond +"_"+ strMillisecond +"_"+ rndNumber.ToString () ;
return strTemp;
}
}
}
ASP.NET中文件上传下载方法集合
文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:
1、如何解决文件上传大小的限制
2、以文件形式保存到服务器
3、转换成二进制字节流保存到数据库以及下载方法
4、上传Internet上的资源
第一部分:
首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改Web.Config文件来自定义最大文件大小,如下:
这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大 MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的 HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET 建立的pipe里分块读取数据。实现方法如下:
IServiceProvidERProvider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[]bs=wr.GetPreloadedEntityBody();
.
if(!wr.IsEntireEntityBodyIsPreloaded())
{
intn=1024;
byte[]bs2=newbyte[n];
while(wr.ReadEntityBody(bs2,n)>0)
{
..
}
}
这样就可以解决了大文件的上传问题了。
第二部分:
下面我们来介绍如何以文件形式将客户端的一个文件上传到服务器并返回上传文件的一些基本信息。
首先我们定义一个类,用来存储上传的文件的信息(返回时需要)。
public class FileUpLoad
{
public FileUpLoad()
{}
/**////
/// 上传文件名称
///
public string FileName
{
get
{
return fileName;
}
set
{
fileName = value;
}
}
private string fileName;
/**////
/// 上传文件路径
///
public string FilePath
{
get
{
return filepath;
}
set
{
filepath = value;
}
}
private string filepath;
/**////
/// 文件扩展名
///
public string FileExtension
{
get
{
return fileExtension;
}
set
{
fileExtension = value;
}
}
private string fileExtension;
}
另外我们还可以在配置文件中限制上传文件的格式(App.Config):
<?XML version="1.0" encoding="gb2312" ?>
<Application>
<FileUpLoad>
<Format>.jpg|.gif|.png|.bmp
</FileUpLoad>
</Application>
这样我们就可以开始写我们的上传文件的方法了,如下:
public FileUpLoad UpLoadFile(HtmlInputFile InputFile,string filePath,string myfileName,bool isRandom)
{
FileUpLoad fp = new FileUpLoad();
string fileName,fileExtension;
string saveName;
//
//建立上传对象
//
HttpPostedFile postedFile = InputFile.PostedFile;
fileName = System.IO.Path.GetFileName(postedFile.FileName);
fileExtension = System.IO.Path.GetExtension(fileName);
//
//根据类型确定文件格式
//
AppConfig app = new AppConfig();
string format = app.GetPath("FileUpLoad/Format");
//
//如果格式都不符合则返回
//
if(format.IndexOf(fileExtension)==-1)
{
throw new ApplicationException("上传数据格式不合法");
}
//
//根据日期和随机数生成随机的文件名
//
if(myfileName != string.Empty)
{
fileName = myfileName;
}
if(isRandom)
{
Random objRand = new Random();
System.DateTime date = DateTime.Now;
//生成随机文件名
saveName = date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString() + date.Second.ToString() + Convert.ToString(objRand.Next(99)*97 + 100);
fileName = saveName + fileExtension;
}
string phyPath = HttpContext.Current.Request.MapPath(filePath);
//判断路径是否存在,若不存在则创建路径
DirectoryInfo upDir = new DirectoryInfo(phyPath);
if(!upDir.Exists)
{
upDir.Create();
}
//
//保存文件
//
try
{
postedFile.SaveAs(phyPath + fileName);
fp.FilePath = filePath + fileName;
fp.FileExtension = fileExtension;
fp.FileName = fileName;
}
catch
{
throw new ApplicationException("上传失败!");
}
//返回上传文件的信息
return fp;
}
然后我们在上传文件的时候就可以调用这个方法了,将返回的文件信息保存到数据库中,至于下载,就直接打开那个路径就OK了。
第三部分:
这里我们主要说一下如何以二进制的形式上传文件以及下载。首先说上传,方法如下:
public byte[] UpLoadFile(HtmlInputFile f_IFile)
{
//获取由客户端指定的上传文件的访问
HttpPostedFile upFile=f_IFile.PostedFile;
//得到上传文件的长度
int upFileLength=upFile.ContentLength;
//得到上传文件的客户端MIME类型
string contentType = upFile.ContentType;
byte[] FileArray=new Byte[upFileLength];
Stream fileStream=upFile.InputStream;
fileStream.Read(FileArray,0,upFileLength);
return FileArray;
}
这个方法返回的就是上传的文件的二进制字节流,这样我们就可以将它保存到数据库了。下面说一下这种形式的下载,也许你会想到这种方式的下载就是新建一个 aspx页面,然后在它的Page_Load()事件里取出二进制字节流,然后再读出来就可以了,其实这种方法是不可取的,在实际的运用中也许会出现无法打开某站点的错误,我一般采用下面的方法:
首先,在Web.config中加入:
<add verb="*" path="openfile.aspx" type="RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/>
这表示我打开openfile.aspx这个页面时,系统就会自动转到执行RuixinOA.Web.BaseClass.OpenFile 这个类里的方法,具体实现如下:
using System;
using System.Data;
using System.Web;
using System.IO;
using Ruixin.WorkFlowDB;
using RXSuite.Base;
using RXSuite.Component;
using RuixinOA.BusinessFacade;
namespace RuixinOA.Web.BaseClass
{
/**////
/// NetUFile 的摘要说明。
///
public class OpenFile : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//从数据库中取出要下载的文件信息
RuixinOA.BusinessFacade.RX_OA_FileManager os = new RX_OA_FileManager();
EntityData data = os.GetFileDetail(id);
if(data != null && data.Tables["RX_OA_File"].Rows.Count >0)
{
DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0];
context.Response.Buffer = true;
context.Response.Clear();
context.Response.ContentType = dr["CContentType"].ToString();
context.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(dr["CTitle"].ToString()));
context.Response.BinaryWrite((Byte[])dr["CContent"]);
context.Response.Flush();
context.Response.End();
}
}
public bool IsReusable
{
get { return true;}
}
}
}
执行上面的方法后,系统会提示用户选择直接打开还是下载。这一部分我们就说到这里。
第四部分:
这一部分主要说如何上传一个Internet上的资源到服务器。
首先需要引用 System.Net 这个命名空间,然后操作如下:
HttpWebRequest hwq = (HttpWebRequest)WebRequest.Create("http://localhost/pwtest/webform1.aspx");
HttpWebResponse hwr = (HttpWebResponse)hwq.GetResponse();
byte[] bytes = new byte[hwr.ContentLength];
Stream stream = hwr.GetResponseStream();
stream.Read(bytes,0,Convert.ToInt32(hwr.ContentLength));
//HttpContext.Current.Response.BinaryWrite(bytes);
HttpWebRequest 可以从Internet上读取文件,因此可以很好的解决这个问题。
第五部分:总结
今天简单的介绍了几种文件上传与下载的方法,都是在实际的项目开发中经常需要用到的,可能还有不完善的地方,希望大家可以互相交流一下项目开发中的经验。