asp分段上传
Ⅰ 上传ASP怎么上传啊
既然是上传,那么一定是有服务器或空间(如果是自己的服务器,那么现在服务器里面创建站点),那么就应该有空间的ftp地址、账号及密码,使用上传工具(举例:flashfxp、cuteftp等),录入ftp信息后,打开服务器空间,界面一般分左右两边,左边是本机,右边是服务器(也可以自己设置),一般服务器里面会有个wwwroot的文件夹,从左边找到本机要上传的asp文件,把根目录的程序上传到wwwroot文件夹下即可。
Ⅱ 大asp文件如何分成小片上传
教你一个小技巧
把ASP文件分段,分为 1.asp 2.asp .....
然后在 index.asp 中这样:
<body>
<!--#include file="1.asp"-->
<!--#include file="2.asp"-->
.....
</body>
你可以根据自己的需要任意分割各文件的大小,这样就解决了上传的问题了
同时,如果以后想要修改,只需要修改某一小部分就可以了
Ⅲ asp.net 大文件分片上传处理如何实现
用FormData对象可以实现,参考网页链接
Ⅳ 请问用asp或者。net 如何上传100G或更大视频文件
将100G分段为小文件
分别上传后
在服务端重新组合
没试过
只是一个思路
Ⅳ asp如何实现文件上传功能
基本原理是:采用ADO Stream对象的BinaryRead方法将FORM中的所有数据读出,从中截取出所需的文件数据,以二进制文件方式存盘。
下面是上传文件页面的一个例子:
<html>
<body>
<form name="Upload" Method="Post" Enctype="multipart/form-data" Action="Upload.asp">
<input type="file" name="FileName">
<INPUT TYPE="Submit" VALUE="Upload"></TD>
</form>
</body>
</html>
(5)asp分段上传扩展阅读
几种文件上传技术的比较
1、基于HTTP协议
该方法需要编程者利用第三方软件,如DELPHI、VB等,在应用程序中先进行HTTP协议编程,然后将待上传文件内容按HTTP协议的格式打包,最后向WEB服务器发送上传的请求报文,从而实现文件的上传。
因为DELPHI和VB不能编写完整的WEB网络程序,只能编写WEB小应用程序,因此,该方法只用于功能受限的网络应用。
2、基于VB(或DELPHI等)开发的文件上传组件
该方法利用VB(或DELPHI等编程语言)开发ASP服务器组件,实现特定的文件上传服务。它首先利用ASP表单功能将文件(二进制格式)从用户端上传到服务器端,然后使用VB开发的组件,对二进制文件进行处理,成为可以正常读写的文件。
该方法要求编程者不仅掌握ASP语言,而且还能利用VB等第三方语言进行组件编程,增加了开发的难度。
3、基于数据库技术
该方法和上个方法有类似之处。不同的地方在于对上传的二进制文件的处理上。它使用数据库来保存二进制文件。无论是小型数据库还是大型数据库都提供了存储二进制数据的数据类型,只要以Append Chunk方式将数据存入相应的字段就可以了。
该方法虽然简单可行,但是因为每次上传的文件大小都是不一样的,因此,会对数据库的空间造成很大的浪费,降低了数据的访问速度;并且使得文件只能在数据库环境下进行访问,造成了很大的不便。
Ⅵ asp如何实现图片和视频批量上传
ASP批量上传图片代码风声无组件上传类'上传界面 up.asp<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%><!--#include file="../Connections/conn.asp" --><%
'主菜单
Dim zpmenurs
Dim zpmenurs_numRowsSet zpmenurs = Server.CreateObject("ADODB.Recordset")
zpmenurs.ActiveConnection = MM_conn_STRING
zpmenurs.Source = "SELECT * FROM menu_2 WHERE menu=3"
zpmenurs.CursorType = 0
zpmenurs.CursorLocation = 2
zpmenurs.LockType = 1
zpmenurs.Open()zpmenurs_numRows = 0
%><%'次级菜单
Dim zpchildrs
Dim zpchildrs_numRowsSet zpchildrs = Server.CreateObject("ADODB.Recordset")
zpchildrs.ActiveConnection = MM_conn_STRING
zpchildrs.Source = "SELECT * FROM menu_2child"
zpchildrs.CursorType = 0
zpchildrs.CursorLocation = 2
zpchildrs.LockType = 1
zpchildrs.Open()zpchildrs_numRows = 0
%>//连动菜单脚本 如果不做连动菜单可以删除//////////////////////////////////////////-------------开始----------------------------------------------------------------------
<SCRIPT language=javascript1.2>
function showsubmenu(sid)
{
whichel = eval("submenu" + sid);
if (whichel.style.display == "none")
{
eval("submenu" + sid + ".style.display='';");
}
else
{
eval("submenu" + sid + ".style.display='none';");
}
}
</SCRIPT><SCRIPT language=JavaScript type=text/javascript>
<!--var arrDynaList = new Array();
var arrDL1 = new Array();arrDL1[1] = "mainmenu"; // Name of parent list box
arrDL1[2] = "picform1"; // Name of form containing parent list box
arrDL1[3] = "submenu"; // Name of child list box
arrDL1[4] = "picform1"; // Name of form containing child list box
arrDL1[5] = arrDynaList;
<%
Dim txtDynaListRelation, txtDynaListLabel, txtDynaListValue, = "menu_father" // Name of recordset field relating to parent
txtDynaListLabel = "menu_child" // Name of recordset field for child Item Label
txtDynaListValue = "menu_child" // Name of recordset field for child Value
Set oDynaListRS = zpchildrs // Name of child list box recordset
Dim varDynaList
varDynaList = -1Dim varMaxWidth
varMaxWidth = "1"Dim varCheckGroup
varCheckGroup = oDynaListRS.Fields.Item(txtDynaListRelation).ValueDim varCheckLength
varCheckLength = 0Dim varMaxLength
varMaxLength = 0While (NOT oDynaListRS.EOF)If (varCheckGroup <> oDynaListRS.Fields.Item(txtDynaListRelation).Value) Then
If (varCheckLength > varMaxLength) Then
varMaxLength = varCheckLength
End If
varCheckLength = 0
End If
%>
arrDynaList[<%=(varDynaList+1)%>] = "<%=(oDynaListRS.Fields.Item(txtDynaListRelation).Value)%>"
arrDynaList[<%=(varDynaList+2)%>] = "<%=(oDynaListRS.Fields.Item(txtDynaListLabel).Value)%>"
arrDynaList[<%=(varDynaList+3)%>] = "<%=(oDynaListRS.Fields.Item(txtDynaListValue).Value)%>"
<%
If (len(oDynaListRS.Fields.Item(txtDynaListLabel).Value) > len(varMaxWidth)) Then
varMaxWidth = oDynaListRS.Fields.Item(txtDynaListLabel).Value
End If
varCheckLength = varCheckLength + 1
varDynaList = varDynaList + 3
oDynaListRS.MoveNext()
WendIf (varCheckLength > varMaxLength) Then
varMaxLength = varCheckLength
End If
%>//-->
</SCRIPT><SCRIPT language=JavaScript type=text/javascript>
<!--
function setDynaList(arrDL){var oList1 = document.forms[arrDL[2]].elements[arrDL[1]];
var oList2 = document.forms[arrDL[4]].elements[arrDL[3]];
var arrList = arrDL[5];
clearDynaList(oList2);
if (oList1.selectedIndex == -1){
oList1.selectedIndex = 0;
}populateDynaList(oList2, oList1[oList1.selectedIndex].value, arrList);
return true;
}
function clearDynaList(oList){for (var i = oList.options.length; i >= 0; i--){
oList.options[i] = null;
}
oList.selectedIndex = -1;
}
function populateDynaList(oList, nIndex, aArray){for (var i = 0; i < aArray.length; i= i + 3){
if (aArray[i] == nIndex){
oList.options[oList.options.length] = new Option(aArray[i + 1], aArray[i + 2]);
}
}if (oList.options.length == 0){
oList.options[oList.options.length] = new Option("[none available]",0);
}
oList.selectedIndex = 0;
}function Kermy_JS(jsStr) {
return eval(jsStr)
}function MM_jumpMenu(targ,selObj,restore){ //v3.0
eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
if (restore) selObj.selectedIndex=0;
}
//-->
</SCRIPT>-------------------------------连动菜单结束-----------------------------------//以下为上传界面==============================================<TABLE borderColor=#0099ff height=80 cellSpacing=1 cellPadding=0 width="100%" bgColor=#0099ff border=0>
<TBODY>
<TR>
<TD vAlign=center align=left width="15%" bgColor=#ffffff height=37>选择类型:</TD>
<TD vAlign=center align=left bgColor=#ffffff colSpan=2>添加具体项目:<SELECT id=mainmenu onchange="Kermy_JS('setDynaList(arrDL1)')" name=mainmenu ?> <OPTION value="<%=(zpmenurs.Fields.Item(" selected menu_father?).Value)%>"></OPTION></SELECT><SELECT id=submenu name=submenu></SELECT><% '上传文件个数
num=1
if request.querystring("number")<>"" Then
num=Trim(request.querystring("number"))end if
%>上传文件数 <SELECT onchange="MM_jumpMenu('parent',this,0)" name=menu1> <OPTION selected>== 请选择==</OPTION> <OPTION value=?number=1>1</OPTION> <OPTION value="?number=<%=i%>"></OPTION></SELECT> <INPUT id=num type=hidden value="<%=num %>" name=num></TD></TR><%
for j=1 to num
%>
<TR>
<TD vAlign=center align=left bgColor=#ffffff>上传图片<%= j %>:</TD>
<TD vAlign=center align=left bgColor=#ffffff colSpan=2><INPUT id=pic style="WIDTH: 100px" type=file onchange=null.value=no name=pic> </TD></TR><% next %>
<TR>
<TD vAlign=center align=left bgColor=#ffffff> </TD>
<TD vAlign=center align=left bgColor=#ffffff colSpan=2><INPUT type=submit value=提交 name=Submit> <LABEL><INPUT type=reset value=重置 name=Submit2> </LABEL></TD></TR>
<TR>
<TD height=1></TD>
<TD width="34%"></TD>
<TD width="51%"></TD></TR></TBODY></TABLE><%
zpmenurs.Close()
Set zpmenurs = Nothing
%><%
zpchildrs.Close()
Set zpchildrs = Nothing
%>up.asp 结束
Ⅶ ASP如何实现批量上传图片,并在数据库中有记录
<%
dim conn
dim rs
dim rs2
set conn=server.createobject("adodb.connection")
conn.connectionstring="Provider = Microsoft.Jet.OLEDB.4.0;Data Source="&server.mapPath("db.mdb")
conn.open
formsize=request.totalbytes
if formsize<>0 then '这里只判断了是否等于0,等于0就说明没有传过来数据。以后可以要多做点判断,比如限制图片大小的时候要判断一下。
formdata=request.binaryread(formsize)
bncrlf=chrB(13)&chrB(10)
divider=leftB(formdata,clng(instrb(formdata,bncrlf))-1)
datastart=instrb(formdata,bncrlf&bncrlf)+4
dataend=instrb(datastart+1,formdata,divider)-datastart
mydata=midb(formdata,datastart,dataend)'这里也要检测一下,就是检测这个数据里面是不是有病毒词汇之类的,这个可以在网上查一下病毒里面可能出现的词语,如果有这些词语,直接在这里就把这个mydata销毁,然后response.redirect "xxx.asp",有病毒赶快跳转,不要处理带病毒的数据。
set rs=server.createobject("ADODB.recordset")
sql="select * from imgurl"
rs.open sql,conn,1,3
rs.addnew
rs("img").AppendChunk myData'把这个图片的二进制数据新增到img字段里面。
tpm=replace(now(),"/","_") '用的日期做名字,日期里面有"/"," ",":"之类的东西,这些东西全部替换成"_"。
tpm=replace(tpm,":","_")
tpm=replace(tpm," ","_")
rs("图片名")=tpm
rs.update
Set MyStream=Server.CreateObject("Adodb.Stream")
MyStream.Type=1
MyStream.Open
MyStream.Write rs("img").getChunk(8000000)
MyStream.SaveToFile server.mappath("pic/"&tpm&".jpg")
MyStream.close
set MyStream=nothing
rs("img")="" '把access里面的二进制图片内容删除,只保留图片的名字。
rs.update
rs.close
set rs=nothing
response.write "<script>alert(""上传成功"");location.href=""upload.asp"";</script>"
end if
%>
<form action="upload.asp" method="post" enctype="multipart/form-data">
<input type="file" name="imgurl">
<input type="submit" name="ok" value="上传">
</form>
<!--------------下面是把图片显示出来------------------->
<div style="margin-top:2em;"><!--------------创建一个div把图片显示区域定位一下------------------->
<%
set rs2=server.createobject("ADODB.recordset")
sql2="select * from imgurl order by id desc"
rs2.open sql2,conn,1,1
for s=1 to rs2.recordcount
if not rs2.eof and not rs2.bof then
%>
<img src="pic/<%=rs2("图片名")%>.jpg">
<%
else
exit for
end if
rs2.movenext
next
rs2.close
set rs2=nothing
%>
</div>
<%
conn.Close
Set conn = Nothing
%>
<!--至于删除图片,这个就很简单了,图片的名字都已经进access里面了,直接读一下access里面的名字,读了一个名字,然后用fso在pic文件夹里面去删除对应的图片文件就可以了。--->
效果图:网页链接
Ⅷ 在asp中关于图片上传到数据库的问题
我用的是Accsee2003的数据库,如果是SQL的话把链接方式变一下就Ok了,下面我把处理二进制数据流的文件给你!把你要上传的附带图片的表单上传到一个接受文件,然后接收文件的头部包含下面这个处理文件,在接收文件里直接就能用处理文件里定义的Dictionary对象接收表单传过来的值了!是这样接收的
rst.addnew
rst("gds_gcid")=formdata.item("parentid")
rst("gds_name")=formdata.item("gdsname")
rst("gds_price")=formdata.item("gdsprice")
rst("gds_jj")=formdata.item("gdsjj")
rst("gds_info")=formdata.item("gdsinfo")
rst("gds_img")=formdata.item("image")
rst.update
另外在你要上传的form 标签里加enctype="multipart/form-data"这样一条属性,意思是说将表单中的内容分段上传,如果还有什么问题可以给我留言
<%
dim data,datalength,fstart,fend,tstart,tend,tinfo,flag,flaglen,tformname,tfile,tfilename,tfilepath,tfileext,sfilename
set formdata=server.CreateObject("Scripting.Dictionary")
set updata=server.CreateObject("ADODB.Stream")
set tmpdata=server.CreateObject("ADODB.Stream")
updata.Type=1'设置对象的数据类型为二进制数据
updata.mode=3'设置对象的打开模式为读写模式
updata.open'打开对象
updata.write request.BinaryRead(request.TotalBytes)
updata.position=0
data=updata.read
datalength=updata.size
tcrlf=chrb(13) & chrb(10)'回车符号代码
flag=leftb(data,instrb(data,tcrlf)-1)'获取每个表单项目数据之间的分隔符
fstart=lenb(flag)+2'搜索开始位置 加2是因为分隔符后有一个回车符号占两个字节
flaglen=fstart'分隔符长度,包含了后面的回车符
'循环处理表单元素
do
'分离出表单元素信息 即从开始查找位置到有两个回车符之间的信息
fend=instrb(fstart,data,tcrlf&tcrlf)+3
'初始化临时STREAM对象
tmpdata.type=1
tmpdata.mode=3
tmpdata.open
'设置指针位置
updata.position=fstart
updata.to tmpdata,fend-fstart'将元素表单信息复制到临时STREAM对象
fstart=instrb(fend,data,flag)-1'查找下一个分隔符所在位置
'fstart=instrb(fend,data,flag)
tmpdata.position=0
tmpdata.type=2'设置读取方式为文本
tmpdata.charset="gb2312"'设置编码方式为GB2312
tinfo=tmpdata.readtext
'取得表单元素的名称
tstart=instr(22,tinfo,"name=""")+6
tend=instr(tstart,tinfo,"""",1)
tformname=mid(tinfo,tstart,tend-tstart)
'取得表单元素的值
if instr(tstart,tinfo,"filename=""",1)>0 then '如果是文件
tmpdata.close
tmpdata.type=1
tmpdata.mode=3
tmpdata.open
'取得文件属性
tstart=instr(tend,tinfo,"filename=""",1)+10
tend=instr(tstart,tinfo,"""",1)
tfile=mid(tinfo,tstart,tend-tstart)'得到文件全路径
if tfile<>"" then
tfilename=mid(tfile,instrrev(tfile,"\")+1)'得到文件名
tfilepath=left(tfile,instrrev(tfile,"\"))'得到文件路径
tfileext=mid(tfile,instrrev(tfile,".")+1)' 得到文件后缀
sfilename=GetRndFileName(tfileext)
'response.write tfilename & "<br>" & tfilepath & "<br>" & tfileext
'得到文件数据
updata.position=fend
updata.to tmpdata,fstart-2-fend
tmpdata.savetofile server.MapPath("../pic/goods") & "\" & sfilename,2
formdata.add tformname,sfilename
end if
else
'如果是表单元素
tmpdata.close
tmpdata.type=1
tmpdata.mode=3
tmpdata.open
updata.position=fend'设置指针指向数据区域开始位置
updata.to tmpdata,fstart-fend-2'复制数据到临时STREAM对象:复制长度为一下个分隔符开始位置-2 -2是因为要减掉最后的回车符长度
tmpdata.position=0
tmpdata.type=2
tmpdata.charset="gb2312"
formdata.add tformname,tmpdata.readtext
end if
fstart=fstart+flaglen'得到下次搜索开始位置:分隔符开始位置加上分融符长度得到下次搜索开始位置
tmpdata.close
loop while (fstart+2)<datalength'如果还没有到结尾 因为束标志是 -- 两个字节,所以这里要加2后再判断
set tmpdata=nothing
updata.close
set updata=nothing
for each key in formdata.keys
response.Write "表单控件名:" & key & " 值:" & formdata.item(key) & "<br>"
next
' 取随机文件名
Function GetRndFileName(sExt)
Dim sRnd
Randomize
sRnd = Int(900 * Rnd) + 100
GetRndFileName = year(now) & month(now) & day(now) & hour(now) & minute(now) & second(now) & sRnd & "." & sExt
End Function
%>
Ⅸ asp上传图片原理(不要代码)只求论理
asp无组件上传的原理
一、无组件上传的原理
我还是一点一点用一个实例来说明的吧,客户端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方法虽然可以分块读取,但是却不能跳过某一段读取!
Ⅹ 一个asp上传文件大小的问题!!!!!!!!!!!!!!!!!
这个过程不设置大小,是调时设置大小的,你查找调用 GetDate(xxx) 的地方,把xxx改成你希望的大小,比如 GetDate(104857600) 就可以上传100M。