我还是一点一点用一个实例来说明的吧,客户端HTML如下。要浏览上传附件,我们通过<input type="file">元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data":
<form method="post" action="upload.asp" enctype="multipart/form-data">
<label>
<input type="file" name="file1" />
</label>
<br />
<input type="text" name="filename" value="default filename"/>
<br />
<input type="submit" value="Submit"/>
<input type="reset" value="Reset"/>
</form>
在后台asp程序中,以前获取表单提交的ASCII 数据,非常的容易。但是如果需要获取上传的文件,就必须使用Request对象的BinaryRead方法来读取。BinaryRead方法是对当前输入流进行指定字节数的二进制读取,有点需要注意的是,一旦使用BinaryRead 方法后,再也不能使用Request.Form 或 Request.QueryString 集合了。结合Request对象的TotalBytes属性,可以将所有表单提交的数据全部变成二进制,不过这些数据都是经过编码的。首先让我们来看看这些数据是如何编码的,有无什么规律可循,编段代码,在代码中我们将BinaryRead读取的二进制转化为文本,输出出来,在后台的upload.asp中(注意该示例不要上传大文件,否则可能会造成浏览器死掉): <% Dim biData, PostData Size = Request.TotalBytes biData = Request.BinaryRead(Size) PostData = BinaryToString(biData,Size) Response.Write "<pre>" & PostData & "</pre>" '使用pre,原样输出格式 ' 借助RecordSet将二进制流转化成文本 Function BinaryToString(biData,Size) Const adLongVarChar = 201 Set RS = CreateObject("ADODB.Recordset") RS.Fields.Append "mBinary", adLongVarChar, Size RS.Open RS.AddNew RS("mBinary").AppendChunk(biData) RS.Update BinaryToString = RS("mBinary").Value RS.Close End Function %>
简单起见,上传一个最简单的文本文件(G:\homepage.txt,内容为"宝玉:http://www.webuc.net")来试验一下,文本框filename中保留默认值"default filename",提交看看输出结果:
-----------------------------7d429871607fe Content-Disposition: form-data; name="file1"; filename="G:\homepage.txt" Content-Type: text/plain 宝玉:http://www.webuc.net -----------------------------7d429871607fe Content-Disposition: form-data; name="filename" default filename -----------------------------7d429871607fe--可以看出来对于表单中的项目,是用过"-----------------------------7d429871607fe"这样的边界来分隔成一块一块的,每一块的开始都有一些描述信息,例如:Content-Disposition: form-data; name="filename",在描述信息中,通过name="filename"可以知道表单项的name。如果有filename="G:\homepage.txt"这样的内容,说明是一个上传的文件,如果是一个上传的文件,那么描述信息会多一行Content-Type: text/plain来描述文件的Content-Type。描述信息和主体信息之间是通过换行来分隔的。
嗯,基本上清晰了,根据这个规律我们就知道该怎么来分离数据,再对分离的数据进行处理了,不过差点忽略一个问题,就是边界值(上例中的"-----------------------------7d429871607fe")是怎么知道的?每次上传这个边界值是不一样的,还好还好asp中可以通过Request.ServerVariables( "HTTP_CONTENT_TYPE")来获之,例如上例中HTTP_CONTENT_TYPE内容为:"multipart/form-data; boundary=---------------------------7d429871607fe",有了这个,我们不仅可以判断客户端的form中有无使用enctype="multipart/form-data"(如果没有使用,那么下面就没必要执行啦),还可以获取边界值boundary=---------------------------7d429871607fe。(注意:这里获取的边界值比上面的边界值开头要少"--",最好补充上。)
至于如何分析数据的过程我就不多赘述了,无非就是借助InStr,Mid等这样的函数来分离出来我们想要的数据。
二、分块上传,记录进度
要实时反映进度条,实质就是要实时知道当前服务器获取了多少数据?再回想一下我们实现上传的过程,我们是通过Request.BinaryRead(Request.TotalBytes)来实现的,在Request的过程中我们无法得知当前服务器获取了多少数据。所以只能通过变通的方法了,如果我们可以将获取的数据分成一块一块的,然后根据已经上传的块数我们就可以算出来当前上传了多大了!也就是说,如果我1K为1块,那么上传1MB的输入流就分成1024块来获取,例如我当前已经获取了100块,那么就表明当前上传了100K。当我提出分块的时候很多人觉得不可思议,因为他们都忽略BinaryRead方法不仅是可以读取指定大小,而且可以连续读取的。
写个例子来验证一下分块读取的完整性,在刚才的例子基础上(注意该示例不要上传大文件,否则可能会造成浏览器死掉):
<% Dim biData, PostData, TotalBytes, ChunkBytes ChunkBytes = 1 * 1024 ' 分块大小为1K TotalBytes = Request.TotalBytes ' 总大小 PostData = "" ' 转化为文本类型后的数据 ReadedBytes = 0 ' 初始化为0 ' 分块读取 Do While ReadedBytes < TotalBytes biData = Request.BinaryRead(ChunkBytes) ' 当前块 PostData = PostData & BinaryToString(biData,ChunkBytes) ' 将当前块转化为文本并拼接 ReadedBytes = ReadedBytes + ChunkBytes ' 记录已读大小 If ReadedBytes > TotalBytes Then ReadedBytes = TotalBytes Loop Response.Write "<pre>" & PostData & "</pre>" ' 使用pre,原样输出格式 ' 将二进制流转化成文本 Function BinaryToString(biData,Size) Const adLongVarChar = 201 Set RS = CreateObject("ADODB.Recordset") RS.Fields.Append "mBinary", adLongVarChar, Size RS.Open RS.AddNew RS("mBinary").AppendChunk(biData) RS.Update BinaryToString = RS("mBinary").Value RS.Close End Function %>试验一下上传刚才的文本文件,输出结果证明这样分块读取的内容是完整的,并且在While循环中,我们可以在每次循环时将当前状态记录到Application中,然后我们就可以通过访问该Application动态获取上传进度条。
另:上例中是通过字符串拼接的,如果是要拼接二进制数据,可以通过ADODB.Stream对象的Write方法,示例代码如下:
Set bSourceData = createobject("ADODB.Stream") bSourceData.Open bSourceData.Type = 1 'Binary Do While ReadedBytes < TotalBytes biData = Request.BinaryRead(ChunkBytes) bSourceData.Write biData ' 直接使用write方法将当前文件流写入bSourceData中 ReadedBytes = ReadedBytes + ChunkBytes If ReadedBytes > TotalBytes Then ReadedBytes = TotalBytes Application("ReadedBytes") = ReadedBytes Loop
三、保存上传的文件
通过Request.BinaryRead获取提交数据,分离出上传文件后,根据数据类型的不同,保存方式也不同:- 对于二进制数据,可以直接通过ADODB.Stream对象的SaveToFile方法,将二进制流保存成为文件。
- 对于文本数据,可以通过TextStream对象的Write方法,将文本数据保存到文件中。
对于文本数据和二进制数据,是可以方便的相互转换的,对于上传小文件来说,两者基本上没什么差别。但是两种方式保存时还是有一些差别的,对于ADODB.Stream对象,必须将所有数据全部装载完才可以保存成文件,所以使用这种方式如果上传大文件将很占用内存,而对于TextStream对象,可以在文件创建好后,一次Write一部分,分多次Write,这样的好处是不会占用服务器内存空间,结合上面分析的分块获取数据原理,我们可以每获取一块上传数据就将之Write到文件中。我曾做过试验,同样本机上传一个200多MB的文件,使用第一种方式内存一直在涨,到最后直接提示计算机虚拟内存不足,最可恨是即使进度条表示文件已经上传完,但是最终文件还是没有保存上。而使用后一种方法,上传过程中内存基本上无什么变化。
四、未解决的难题
我在博客园上看到Bestcomy描述他的Asp.Net上传组件是可以和Sever.SetTimeOut无关的,而在Asp中我是没能做到,对于上传大文件,就只有将Server.SetTimeOut设置为一个很大的值才可以。不知道有没有比较好的解决方法。
如果我们在保存文件时,使用TextStream对象的Write方法,那么如果用户上传时中断了文件传输,已经上传的那部分文件还是在的,如果可以断点续传就好了。关键问题是Request.BinaryRead方法虽然可以分块读取,但是却不能跳过某一段读取!
五、结束语
原理基本上是说清楚了,但是实际代码要比这复杂的多,要考虑很多问题,最麻烦在分析数据那部分,对于每一块获取的数据,要分析是不是属于描述信息,是表单项目还是上传的文件,文件是否已经上传结束……
相信根据上面的描述,您也可以开发出您自己功能强大的无组件上传组件。我想更多的人关心的只是代码,而不会自己动手去写的,也许没有时间,也许水平还不够,更多的只是已经成为了一种习惯……我在CSDN上见过太多技术八股文——一段说明,然后全是代码。授人以鱼不若授人以渔,给你一个代码,也许你并不会去思考为什么,直接拿去用,当下次碰到类似的问题的时候,还是不知道为什么,希望此文能让更多人学到点什么,最重要是“悟”到点什么!
完整代码整理完善中……
发表于 2004年7月22日 11:06
评论
# re: asp无组件上传进度条解决方案(上)
学习# re: asp无组件上传进度条解决方案
很不错啊!已经很久没有用过asp了,用asp.net应该不会这么复杂吧?
# re: asp无组件上传进度条解决方案
用asp.net当然不用这么复杂,本身就不需要上传组件,但是如果自己写上传组件,估计原理还是差不多的:)# re: asp无组件上传进度条解决方案
因为弄得早了,好久没接触这样的话题,偶尔看到有人提到这个话题也觉得没太大新意所以没好好看过,不知道是不是有一些新的方法思路和技术实现方式。难得见到如此系统和完整的介绍,谢谢宝玉。补充一下我的读后感,可惜我不会用 .Text 的 TrackBack,还请各位教我 :)
这篇文章的内容从逻辑上分为几个部分:
1、HTTP 协议下上传文件的背景知识
这里可以介绍一下相应的 RFC 协议(RFC1867)
2、结合 ASP 方式如何处理上传文件的数据流——Request.BinaryRead,这里谈谈分段读取的方式
3、ASP方式下如何将读取到的数据写入文件或数据库——文本方式和二进制方式分别采用FileSystemObject和ADODB.Stream,数据库就简单了(Oracle稍有不同)
4、需要注意的地方
A. 因为是基于 HTTP 协议方式上传的,将不可避免地受到 WebServer 的页面过期时间限制的影响
B. ADODB.Stream 将数据流写到服务器本地文件时内存占用较大。
C. 可以结合 Response.flush 方式可以把进度刷新到客户端页面(ASP3.0以后默认 Response.Buffer = True,所以要先关闭 buffer 才能使用 flush 产生刷新效果)
5. 其它
自己写一个上传组件或者在其它语言里实现文件上传的方式基本类似:
WEB页面中使用<input file>通过HTTP协议上传——服务器端脚本语言中取得 HTTP 数据流——保存数据流为服务器端本地文件或保存到数据库中
因此,因 ASP.net 与 Java Servlet/JSP 相同,都可以访问 HTTPContext 类似的一个对象来获取该 Page 上下文相关的 Input/Output Object(如 ASP 的Request/Response),和组件实现文件上传的过程实质上是一样的。
当然, ASP.Net/Java 中,没有 ASP 本身不能在本地进行二进制文件写的限制。因此,不必借助 FileSystemObject 或 ADODB.Stream(要注意最新公布的后者的安全漏洞)
组件编程实现的时候有两种方式获取 IIS 的 HTTPContext,但都与 jsp/asp.net 相似,在 OnStartPage 中获取 ASPTypeLibrary.ScriptingContext 或...(另外一个研究MSDNLib发现的IIS接口实现忘记了,回头看看代码,不好意思)
以前用过一些 asp 上传组件,例如 ASPUpload、LyfUpload 等等,但发现要不就是在处理多个 Input 的时候有一些小毛病,或者对中文支持存在缺陷,要不就是在服务器端写文件的时候 CPU 资源占用非常大(文件稍大的时候可以看到一个很高的方波)。最后自己写了一个组件,优化了在本地写文件的问题——就像宝玉说的分块写,呵呵
看到宝玉代码中用 ADO 来做 Binary2String,这个思路非常巧妙,呵呵
VB 中可以用 StrConv(bytArray, vbUnicode) 直接解决,很简单。
# re: asp无组件上传进度条解决方案
>对于文件断点续传问题还是没弄搞定,因为虽然流可以分块读取,但是好像不可以直接跳过一段读取。yes, 看看 RFC 1867 就知道啦
因为数据是流式传送的,浏览器Post给服务器的Request就带了一个完整的流,除非客户端支持指定从文件的某个pos开始读取,呵呵
HTTP/FTP协议支持Response的时候指定位置,所以才有了断点续传和多点下载 :)
# re: asp无组件上传进度条解决方案
谢谢 piggybank 写的这么详细的读后感,经你这么一补充,文章的应该会更加易于理解一点(我从小作文就很差,hoho)。.Text 的 TrackBack我也不知道:(
# re: asp无组件上传进度条解决方案
本来想,ASP3.0 中可用Response.buffer = false
Response.Write "10%"
Response.Flush
...
Response.Write "20%"
Response.Flush
...
间断地把进度写到 HTTP 输出给客户端,这样就不必把进度记录到Application里而直接反映给客户端了。
如果想改善效果,可以把 Response.Write 输出的内容替换成
Response.Write "<Script>RefreshStatus(" & 10 & ")</Script>"
Response.Flush
Response.Write "<Script>RefreshStatus(" & 20 & ")</Script>"
Response.Flush
...
而 RefreshStatus 是一个 javascript 函数,负责更新页面某个 tag 的 value——比如 <span> <input> <div> ...
后来忽然想起,在这个例子中可能不适用:因为输入还没完成,输出可能被阻塞了。
在其它情况下,用这样的方式来反应进度倒是效果不错。对于这个例子具体是不是这样(很可能不行),还要做实验才知道了 :)
# re: asp无组件上传进度条解决方案
但既然文章叫做《asp无组件上传进度条解决方案》,看来有必要补充一下如何实现进度条 :)在一个负责返回进度的asp页面程序中,用上面说的方法从宝玉说的 Application 的变量(或者Session等其它什么地方)中取出该进度值并输出给客户端,然后设置两个机制防止一直等待下去:
1、进度到100%的时候结束当前页面,否则一直阻塞在页面中;
2、到达超时时间,否则等待满足条件1退出。
这样,不需要用户不停地刷新获取新进度,直接能看到结果
完美无缺啦,hoho
# re: asp无组件上传进度条解决方案
谢谢补充:)# re: asp无组件上传进度条解决方案
也许下面的站点提供的上传但文件服务你可以研究下,使用asp的,好像没有timeout的问题http://www.1g.com.cn
另外我维护了一个asp.net版本的上传组件,有兴趣的朋友可以看看
http://www.cnblogs.com/bestcomy/archive/2004/06/09/14267.aspx
# re: asp无组件上传进度条解决方案
非常感谢:)我会好好研究研究的,这两天忙于asp.net forums中文版# re: asp无组件上传进度条解决方案
看这个是.net实现的 断点续传http://www.knowsky.com/4209.html
# re: asp无组件上传进度条解决方案
宝玉及各位高手、大侠,本人是网络编程的初学者,看了关于这篇《re: asp无组件上传进度条解决方案》的文章和诸位的高论之后,觉得不错,这段时间也正在为设计一个asp的上传进度条而绞尽脑汁,下面是我用到的程序(为简单起见,程序中省去了对上传文件的处理),但是上传的进度条不能及时刷新,不管上传文件的大小,总是从0%开始等一会后一下子就到100%了,没有实时反映上传的进度,不知怎样修改才对,郁闷之余,恳请各位高手指点。上传客户端文件upload.asp:
<%Application("Percentage")=0%>
<html>
<head>
<title>
</title>
</head>
<body>
<Script language="javascript">
<!--
function CallBar()
{
Param = "SCROLLBARS=no,RESIZABLE=no, TOOLBAR=no,STATUS=no,MENUBAR=no,WIDTH=400,HEIGHT=100";
Param += ",TOP=" + String(window.screen.Height/2 - 50);
Param += ",LEFT=" + String(window.screen.Width/2 - 200);
window.open("bar.asp", null, Param);
document.frmMain.action = "bar.asp";
document.frmMain.submit();
}
//-->
</Script>
<form name="a" method="post" ENCTYPE="multipart/form-data" action="upfile.asp">
<input type="file" name="MyFile">
<input type=submit name="submit" value="确定" OnClick="CallBar()">
</form>
</body>
</html>
服务器端处理上传文件upfile.asp:
<html>
<head>
<title>
</title>
</head>
<body>
<div align="center">
<%
Dim s,biData, PostData, AllBytes, ChunkBytes,ReadedBytes
set s=CreateObject("Adodb.Stream")
s.mode=3
s.type=1
s.open
ChunkBytes = 1 * 512
AllBytes = Request.TotalBytes
ReadedBytes = 0
Do While ReadedBytes < AllBytes
biData = Request.BinaryRead(ChunkBytes)
s.Write biData
ReadedBytes = ReadedBytes + ChunkBytes
If ReadedBytes > AllBytes Then ReadedBytes = AllBytes
Application("Percentage") = Round(ReadedBytes/AllBytes,2)*100
Loop
set s=Nothing
%>
</div>
</body>
</html>
进度条文件bar.asp:
<%
Response.Expires = -10000
Dim Percentage
Percentage=Application("Percentage")
%>
<html>
<head>
<meta NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<meta http-equiv=refresh content="1,Bar.asp">
<title>Upload Progress Bar</title>
</head>
<body>
<table border="1" width="100%">
<tr>
<td>
<table ID="Prog" border="0" width="<%=Percentage%>%" bgcolor="#FF0000">
<tr>
<td width="100%"> </td>
</tr>
</table>
</td>
</tr>
</table>
<br>
上传百分比:<%=Percentage&"%"%>
</body>
</html>
谢谢了!
# re: asp无组件上传进度条解决方案
不好意思,忘了说明一下,再bar.asp中一定要加上:<%@EnableSessionState=False%>
<%
Response.CacheControl = "no-cache"
Response.Expires = -1
%>
# re: asp无组件上传进度条解决方案
嘿嘿,果然有效,谢谢宝玉,谢谢宝玉,这里真的是很不错,谢谢了!# re: asp无组件上传进度条解决方案
http://output.print2000.com.cn/sendsystem.asp这里有个例子。还有好多网站都有了。不知道从哪里下载过来的。。。
我是菜鸟
宝玉大哥有没时间写整个代码给我们用?
呵呵。期待。。。
# re: asp无组件上传进度条解决方案
最近忙于CnForums的发版,完了以后一定提供一个整套的源码!# re: asp无组件上传进度条解决方案
嘿嘿~~~谢谢大哥# re: asp无组件上传进度条解决方案
TimeOut 的问题建议不用多虑,在ASP里应该是没有办法的。在微软的大文件上传示例中,也是设定一个很大的值。具体请看以下知识库文章:SAMPLE: Using HttpSendRequestEx for Large POST Requests
http://support.microsoft.com/?id=177188
# re: asp无组件上传进度条解决方案
老大...昨天偶然发现好多音乐翻唱站点都是这样的上传功能,比如163888.net29w.net
liusha.net
全都是这样的.
代码都大同小异.而且整合了动网论坛...
不知道哪里有这样的整站下载...
我又不会写.又不会黑....又没的下载,,,,哎.可怎么办啊
# re: asp无组件上传进度条解决方案
现在学还来得及还可以花钱买的阿,嘿嘿
既然这么多人用同一套,那肯定是有下载的,呵呵,再找找,咨询一下他们管理员
# re: asp无组件上传进度条解决方案
试试这个软件如何,基于asp无组件上传技术实现的,功能强大http://www.blue999.com/webfiles/index.htm
# re: asp无组件上传进度条解决方案
下了aspupload的组件,,因为前不久偶然找到一个上传的.地址忘了.英文界面.跟他们的一样.用的aspupload...大小也能控制...就是.....
# re: asp无组件上传进度条解决方案
大哥...我现在帮同学改一个小偷.
有个问题就是用response.end中止运行.
用write输出当前状态
有什么方法能够一步一步走.但是不用改代码?
非得把代码模块才行么?
# re: asp无组件上传进度条解决方案
呵呵,谢谢宝玉兄的好文和各位网友的添砖加瓦,小弟收益匪浅。 :)不知道宝玉的CnForums发版忙完了没,盼望你提到的整套的源码ing...
# 用 WebClient.UploadData 方法 上载文件数据
Ping Back来自:blog.csdn.net# re: asp无组件上传进度条解决方案
不好意思,本人也是一个菜鸟,我想问一个能不能在提交时对数据分块呀# re: asp无组件上传进度条解决方案
太谢谢你了。我就是因大件上传问题头痛了我几天几夜,我还不只一次深究黄文版的rfc1867协议到凌晨两三点!还好,看了您这文章,我总有着了,可以交差了!!!
哈哈…………
无以言表!!!
Thank Godness
真希望能与本文的作者交个朋友!!
我的QQ:35938707
Email:hehout@163.com
# re: asp无组件上传进度条解决方案
要是有个实例出来会更好,我试了半天都没得D~!# re: asp无组件上传进度条解决方案
http://webuc.net/myproject/upload/# 用 WebClient.UploadData 方法 上载文件数据[转]
Ping Back来自:www.donews.net# re: asp无组件上传进度条解决方案
我写了一个上传的类感觉还好
class upload
dim file_start
dim file_end
dim file_out_stream
dim file_dat
dim file_nam
private sub Class_Initialize()
end sub
'文件上传方法
public sub upload()
set file_out_stream=Server.CreateObject("adodb.stream")
file_out_stream.type=1
file_out_stream.mode=3
file_out_stream.open
file_out_stream.write file_dat
file_out_stream.Position=0
request_data=file_out_stream.read
'二进制读文件部分
syn= chrB(13) & chrB(10) & chrB(13) & chrB(10)
syn1= chrb(45)& chrb(45)& chrb(45)& chrb(45)& chrb(45)
request_data=file_dat
file_start=instrb(request_data,syn)+3
file_x_body=midb(request_data,file_start)
file_mid_end=instrb(file_x_body,syn1)-2
file_mid_body=midb(file_x_body,1,file_mid_end)
file_size=lenb(file_mid_body)-2
'文件存储
set dr=CreateObject("Adodb.Stream")
dr.Mode=3
dr.Type=1
dr.Open
file_out_stream.position=File_Start
file_out_stream.copyto dr,File_Size
dr.SaveToFile server.MapPath("imgupload/"&file_nam),2
dr.Close
set dr=nothing
file_out_stream.Close
set file_out_stream=nothing
end sub
'文件2进制输入
public property let file_data(byval xx)
file_dat=xx
end property
'文件名输入
public property let file_name(byval yy)
file_nam=yy
end property
'文件名制返回
public property get file_name
file_name=file_nam
end property
'主体文件返回
public property get file_body
file_body=file_mid_body
end property
end class
# re: asp无组件上传进度条解决方案
请问一下,在用ASP。NET内置的组件上传图片时,如何获取图片的尺寸啊,就是图片的长和宽??# re: asp无组件上传进度条解决方案
好像可以通过分析文件头。我一般是上传时通过脚本获取
具体可参考我blog上提供下载的dotarticle源码
# re: asp无组件上传进度条解决方案
http://www.yuyesf.com/Article/Class3/Class13/Class53/200504/2490.html# re: asp无组件上传进度条解决方案
遇到10M以上的就有问题了。# re: asp无组件上传进度条解决方案
谁有支持多文件上传,大文件上传,断点续传的免费组件吗?或者哪个大哥教下我吧~~
还有ASPUPLOAD支持断点续传吗???
# re: asp无组件上传进度条解决方案
http://webuc.net/myproject/upload/除了断点续传都支持
# re: asp无组件上传进度条解决方案
正在为ASP无组件上传大文件发愁,谢谢了!!# re: asp无组件上传进度条解决方案
请宝玉和各位前辈指教,我无法获取网站的boundary的值,获取的Content-Type标头值都是"Text/html"之类,而从来没有获取过“multipart/form-data; boundary=---------------------------7d429871607fe”这样的标头,恳请指教!!# re: asp无组件上传进度条解决方案
错误类型:Server 对象, ASP 0177 (0x800401F3)
无效的类别字符串
/mdb/admin/news/upload_1.asp, 第 6 行
这种原因是怎样造成的
我在服务器上能上传达室,在本地机上就不能运行上传了
这是什么原因呢!
请各位大哥帮我解决一下好吗?
# re: asp无组件上传进度条解决方案
http://webuc.net/myproject/upload/除了断点续传都支持
这个是否没有采取边传边写数据?我看服务器内存还是在不断减少。但只是波动不大。。
# 让asp.net默认的上传组件支持进度条反映
Ping Back来自:blog.csdn.net# re: asp无组件上传进度条解决方案
宝玉大哥,您好!看了您的《Asp无组件上传进度条解决方案》的文章,对我深有帮助,因为我正在搞一个从上传的文件中获取内容字符串的小东西。现在已经完成的差不多了,只是有个问题,一直没解决,特来请教一下。使用ADO取字符串时,对于ANSI编码的文件没有问题,可当上传的文件为UTF-8的时候中文字符却是乱码了,请问该怎么处理呢?Thanks
my email:xiesanshao2@tom.com
# re: asp无组件上传进度条解决方案
谢谢 宝玉 为大家提供的优质源码, 最近开始涉足网站开发, 为单位做一个bs结构的管理系统,刚好做到文件上传和下载部分,有幸看到了 宝玉 的分析文章和提供的多个版本的使用样例,让我获益颇多....提一个问题: 在样例代码总 chunk size = 64 * 1024, 为什么? 我很迷惑你这么做.
还有一个小问题,upload.asp中建立了Application,也有remove函数,但是确没有被调用,这是一个危险的事情.
eMail: liuyi@sobey.com
# re: asp无组件上传进度条解决方案
收益良多啊但是我还有个问题搞不定,
在一个修改提交页面,里面已经读取了数据库内容,并且有上传的功能,问题就出在了我在写入数据库的时候调用了Request.Form这个集合,但是在上传的时候调用的有是BinaryRead,结果就出错了。
我不知道怎么样才能正确读取我的form里面的内容并写入数据库。
# re: asp无组件上传进度条解决方案
很好,谢谢# re: asp无组件上传进度条解决方案
>>我不知道怎么样才能正确读取我的form里面的内容并写入数据库。我也不清楚这个问题,找了半天,最后只有把变量以querystring的方式提交
action="getdata.asp?po=8989",这样用Request(StrName)好像拿得到
# 用 WebClient.UploadData 方法 上载文件数据
假如某网站有个表单,例如(url: http://localhost/login.aspx):帐号
密码
我们需要在程序中提交数据到这个表单,对于这种表单,我们可以使用 WebClient.UploadData...
# 用 WebClient.UploadData 方法 上载文件数据
假如某网站有个表单,例如(url: http://localhost/login.aspx):帐号
密码
我们需要在程序中提交数据到这个表单,对于这种表单,我们可以使用 WebClient.UploadData...
# re: asp无组件上传进度条解决方案
请教一个问题 win2000+IIS5 用http <input tyle="file"> 上传文件 文件最大可以是多少