为什么传上去的文件都是0字节???

xayzmb 2005-01-10 03:35:42
'下面是上传页面
<form name="FORM" action="AspTop0.asp" method="post">
<input type="file" name="file1" style="width:400" value="">
<input type="submit" name="submit" value="上传文件">
</form>

'下面是上传代码
<% language=VBScript %>
<%
call upLoad
'**********************************************************************
Private Function getFileName(ByVal strFile)
'本函数用来取得上传文件名称
If strFile <> "" Then
getFileName = mid(strFile,InStrRev(strFile, "\")+1)
Else
getFileName = ""
End If
End function
'************************************************************************
private sub upLoad()
on error resume next
'用来执行上传文件的代码
dim objStream
strFileName = Request.Form("file1")
Set objStream = Server.CreateObject("ADODB.Stream")

objStream.Type = 2
objStream.Open
objStream.Charset = "GB2312"
objStream.Position = objStream.Size
objStream.WriteText = strBody
objStream.SaveToFile Server.MapPath(getFileName(strFileName)),2

objStream.Close

if err = 0 then
response.write "上传成功!"
elseif Error.Number = -2147221005 then
response.write "不支持ADODB.Stresm"
else
response.write "上传失败!"
end if

err.clear
set objStream = nothing
End Sub
'**************************************************************************


%>
...全文
918 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangtianyang 2005-01-10
  • 打赏
  • 举报
回复
看不懂
llgzhang 2005-01-10
  • 打赏
  • 举报
回复
有一种情况可能导致该结果:当你在上传操作过程中,在选定上传文件和实际上传操作之间进行了其它的操作(比如判断该文件是否已经被上传),上传上去的文件就是0字节
calmer18 2005-01-10
  • 打赏
  • 举报
回复
http://edu.chinaz.com/2004/6-21/115227.asp
calmer18 2005-01-10
  • 打赏
  • 举报
回复
XML技术上传文件
日期:2002年1月30日 作者:lovefan(转) 人气:8437 今日:7 [大 中 小]

概述
本文讲解了一个使用XML技术上传文件的例子,使用该方法没有传统方法中的种种限制。 这个例子讲述了如何使用MSXML3.0和ADO Stream对象来实现这种新的上传方法。好处有很多,比如,不需要专用的上传组件。


引言
为了在HTML网页中获得上传功能,在客户端我们可以使用如下格式的FORM:

<FORM NAME="myForm"
ACTION="TargetURL.asp"
ENCTYPE="multipart/form-data"
METHOD="post">
<INPUT TYPE="file" NAME="myFile">
<INPUT TYPE="submit" VALUE="Upload File">
</FORM>

这种方案在客户端和服务器端的使用都有很多限制。首先,我们必须使用POST方法,因为GET方法无法处理这样的表单数据。并且,没有什么方法可以在不使用表单的情况下引发一个POST动作。把数据发送给表单处理程序后,浏览器将会把处理程序作为新页面加载,然后使用者会看到一个不讨人喜欢的页面转换过程。
ENCTYPE属性为表单定义了MIME编码方式,上传文件的表单的ENCTYPE属性必须使用“multipart/form-data”。把这个属性设置为“multipart/form-data”就创建了一个与传统结构不同的POST缓冲区(复合结构),ASP的Request对象无法访问这样的表单内容。所以,我们可以使用Request.binaryRead方法来访问这些数据,但是无法使用脚本语言来完成这一切。Request.binaryRead方法返回一个VTarray型数据(只包含无符号一字节字符的Variant型数组)。但是脚本语言只能处理Variant型数据。为了解决这个问题,只能使用专用的ASP上传组件,或者ISAPI扩展程序,比如CPSHOST.DLL。这是设计上的限制。

新的上传方案

需要按照如下步骤操作。
客户端:

使用MSXML 3.0创建一个XML文档
创建一个针对二进制内容的XML节点
使用ADO Stream object将上传的文件数据放入该节点
使用XMLHTTP对象把这个XML文档发送给Web服务器

服务器端:
从Request对象中读出XML文档
读出二进制节点中的数据并且存储到服务器上的文件中。当然,我们也可以将其存储到数据库的BLOB型字段中。
在解释这段代码之前,我们可以对这个方案进行一些思考。

对XML的思考

XML格式支持很多数据类型,比如numeric, float, character等等。很多作者将XML定义为ASCII格式,但是我们不能忽视,XML技术还可以使用“bin.base64”数据类型来描述二进制信息。这个特性在MS XML3.0解析器重得到完全的支持,但是目前还需要一些特别设置。该对象提供一些可以对二进制数据进行完全控制的属性:

obj_node.dataType - 该可读写的属性定义了特定节点的数据类型。MSXML解析器支持更多的数据类型(参见MSDN:http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm)
对于二进制数据,我们可以使用“bin.base64”类型。

obj_node.nodeTypedValue - 该可读写属性包含了按照制定类型表示的指定节点的数据。
我们可以创建一个包含多个bin.base64类型节点的XML文档,节点中包含上传的文件。这点特性可以使用一个POST一次上传多个文件。

我们可以使用XMLHttpRequest对象和POST方法发送一个XML文档给Web服务器。该对象为HTTP服务器提供了客户端协议支持,允许在Web服务器上发送和接受MS XMLDOM对象。XMLHttpRequest是Internet Explorer 5内置的COM对象(不需要定制安装),并且发送完毕后无需转换页面。


对ADO Stream对象的思考

我们可以在客户端创建一个包含一个或者多个二进制节点的XML文档。我们还必须把文件内容填入节点中。但是很不幸,脚本语言不能访问本地文件系统,并且Scripting.FileSystem对象(是Win32系统的内置对象)到目前为止还不能访问二进制文件。这是设计上的限制。所以我们需要另外找一个可以提供对本地二进制文件的访问的COM对象。

ADO Stream对象(MDAC 2.5中的组件)提供了读、写和管理二进制流数据的手段。字节流的内容可以是文本,或者二进制数据,并且没有容量上的限制。在ADO 2.5中,Microsoft对Stream对象的介绍不属于ADO对象结构的任何一层,所以,我们无需捆绑即可使用该对象。

本文中使用Stream对象来访问文件内容,再把内容存入XML节点。


客户端

以下示例代码使用Stream和MSXML对象完成文件上传动作。

<HTML>
<HEAD><TITLE>File Send</TITLE></HEAD>
<BODY>
<INPUT id=btn_send name="btn_send" type=button value="FILE SEND">
<DIV id=div_message>Ready</DIV>
</BODY>
</HTML>

<SCRIPT LANGUAGE=JavaScript>

// 上传函数
function btn_send.onclick()
{
// 创建 ADO-stream 对象
var ado_stream = new ActiveXObject("ADODB.Stream");

// 创建包含默认头信息和根节点的 XML文档
var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML('<?xml version="1.0" ?> <root/>');
// 指定数据类型
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");

// 创建一个新节点,设置其为二进制数据节点
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64";
// 打开Stream对象,读源文件
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Open();
ado_stream.LoadFromFile("c:\\tmp\\myfile.doc");
// 将文件内容存入XML节点
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);

// 可以创建多个二进制节点,一次上传多个文件

// 把XML文档发送到Web服务器
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","./file_recieve.asp",false);
xmlhttp.send(xml_dom);
// 显示服务器返回的信息
div_message.innerHTML = xmlhttp.ResponseText;
}
</SCRIPT>


服务器端

以下代码使用相同的对象提供服务器端的上传处理功能。

<%@ LANGUAGE=VBScript%>
<% Option Explicit
Response.Expires = 0

' 定义变量和对象。
dim ado_stream
dim xml_dom
dim xml_file1

' 创建 Stream 对象
set ado_stream = Server.CreateObject("ADODB.Stream")
' 从Request对象创建 XMLDOM对象
set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load(request)
' 读出包含二进制数据的节点
set xml_file1 = xml_dom.selectSingleNode("root/file1")

' 打开Stream对象,把数据存入其中
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
' 文件存盘
ado_stream.SaveToFile "c:\tmp\upload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close

' 销毁对象
set ado_stream = Nothing
set xml_dom = Nothing
' 向浏览器返回信息
Response.Write "Upload successful!"
%>

也可以使用Stream对象把数据放到数据库的BLOB型字段中。

使用该方法的益处

不引起页面转换。
不需要专用组件。
可同时上传多个文件。
这段程序是纯脚本写成的,可以很容易的插入到其他代码中,而不需要任何HTML对象的配合。还可以把这个逻辑在任何支持COM标准的语言中实现。

系统安全考虑

该方法只能使用于内部网络,因为它需要IE5的安全级别设置为“低”。必须:

允许脚本和ActiveX对象。该设置允许浏览器执行类似 "myobj = new activexobject(...)"的 JScript语句;
必须允许穿越域访问数据源。这个设置允许在客户端使用Stream对象。还必须在服务器和客户端都安装MS XML DOM 3.0 和MDAC 2.5 。

tatty_bad 2005-01-10
  • 打赏
  • 举报
回复
<%
'----------------------------------------------------------
'转发时请保留此声明信息,这段声明不并会影响你的速度!
'******************* 风声上传类 V1.02 *******************
'作者:风声根据无惧上传类修改
'网站:http://www.17560.net
'邮件:Rumor@17560.net
'版权:版权全体,源代码公开,各种用途均可免费使用
'   但修改后必须把修改后的文件发送一份给作者
'**********************************************************
'----------------------------------------------------------
Class UpLoadClass

Private Ver,Err,FormD,FormStream,ItemStream
Dim MaxSize,FileType,SavePath,AutoSave

Private Sub Class_Initialize
MaxSize=150*1024
FileType="jpg/gif"
SavePath="UpLoadFile/"
AutoSave=true
Ver ="Rumor UpLoadClass Version 1.02"
Err=0
Set FormD = Server.CreateObject ("Scripting.Dictionary")
FormD.CompareMode = 1
Set FormStream=server.CreateObject("ADODB.Stream")
Set ItemStream=server.CreateObject("ADODB.Stream")
End Sub

Private Sub Class_Terminate
Set ItemStream=nothing
FormStream.Close()
Set FormStream=nothing
FormD.RemoveAll
Set FormD=nothing
End Sub

Public Sub Open()
Dim RequestSize,RequestData
RequestSize=Request.TotalBytes
if RequestSize<1 then
Err=4
Exit Sub
end if
RequestData=Request.BinaryRead(RequestSize)

Dim FormSize,CrLf,bCrLf,ListSeparator,LenListSep,FormData
FormStream.Type = 1
FormStream.Open
FormStream.Write RequestData
FormSize=FormStream.Size
bCrLf=ChrB(13)&ChrB(10)
Separator=MidB(RequestData,1,InstrB(1,RequestData,bCrLf)-1)

Dim pStart,pEnd,pTemp,ItemInfo,ItemName,ItemData
pStart=LenB(Separator)+2
Do
pEnd = InStrB (pStart,RequestData,bCrLf&bCrLf)+3
ItemStream.Type=1
ItemStream.Open
FormStream.Position=pStart
FormStream.CopyTo ItemStream,pEnd-pStart
ItemStream.Position=0
ItemStream.Type=2
ItemStream.Charset="gb2312"
ItemInfo=ItemStream.ReadText
ItemStream.Close()

pStart=pEnd
pEnd = InStrB (pStart,RequestData,Separator)-1
ItemStream.Type=1
ItemStream.Open
FormStream.Position=pStart
FormStream.CopyTo ItemStream,pEnd-pStart-2
ItemName=Mid(ItemInfo,39,Instr(39,ItemInfo,"""")-39)

if Instr(40,ItemInfo,"filename=""")>0 then
if ItemStream.Size<>0 then
Dim SourceFile,TargetFile
pTemp=52+Len(ItemName)
SourceFile=Mid(ItemInfo,pTemp,Instr(pTemp,ItemInfo,"""")-pTemp)
FormD.Add ItemName&"_Type",Mid(ItemInfo,Instr(pTemp,ItemInfo,"Content-Type: ")+14)
FormD.Add ItemName&"_Name",Mid(SourceFile,InstrRev(SourceFile,"\")+1)
FormD.Add ItemName&"_Path",Left(SourceFile,InstrRev(SourceFile,"\"))
if InstrRev(SourceFile,".")<>0 then
FormD.Add ItemName&"_Ext",Mid(SourceFile,InstrRev(SourceFile,".")+1)
else
FormD.Add ItemName&"_Ext",""
end if
FormD.Add ItemName&"_From",pStart
FormD.Add ItemName&"_Size",ItemStream.Size
FormD.Add ItemName&"_Err",0
if Instr(1,LCase("/"&FileType&"/"),LCase("/"&FormD(ItemName&"_Ext")&"/"))=0 then
if Err<2 then Err=Err+2
FormD(ItemName&"_Err")=FormD(ItemName&"_Err")+2
end if
if FormD(ItemName&"_Size")>MaxSize then
if Err<1 then Err=Err+1
FormD(ItemName&"_Err")=FormD(ItemName&"_Err")+1
end if
if FormD(ItemName&"_Err")=0 then
if AutoSave then
tarFileName=GetTimeStr()
if FormD(ItemName&"_Ext")<>"" then tarFileName=tarFileName&"."&FormD(ItemName&"_Ext")
FormD.Add ItemName,tarFileName
ItemStream.SaveToFile Server.MapPath(SavePath&tarFileName),2
else
FormD.Add ItemName,"Please save first"
end if
end if
else
FormD.Add ItemName,""
end if
else
ItemStream.Position=0
ItemStream.Type=2
ItemStream.Charset="gb2312"
ItemData=ItemStream.ReadText
if FormD.Exists(ItemName) then
FormD(ItemName) = FormD (ItemName)&","&ItemData
else
FormD.Add ItemName,ItemData
end if
end if

ItemStream.Close()
pStart = pEnd+LenB(Separator)+2
loop Until pStart+3>FormSize
End Sub

Public Function GetTimeStr()
GetTimeStr=Cstr(Date())&FormatNumber(Timer()*1000,0)
GetTimeStr=replace(replace(GetTimeStr,"-",""),",","")
End Function

Public Sub Save(Item,FileName)
if Not AutoSave and FormD.Exists(Item&"_From") then
if FormD(Item&"_Err")<>0 then
FormD(Item)=""
Exit Sub
End if
ItemStream.Type = 1
ItemStream.Open
FormStream.Position = FormD(Item&"_From")
FormStream.CopyTo ItemStream,FormD(Item&"_Size")
ItemStream.SaveToFile Server.MapPath(SavePath&FileName),2
ItemStream.Close()
FormD(Item)=FileName
end if
End Sub

Public Function GetData(Item)
GetData=""
if FormD.Exists(Item&"_From") then
if FormD(Item&"_Err")<>0 then Exit Function
FormStream.Position = FormD(Item&"_From")
GetData=FormStream.Read(FormD(Item&"_Size"))
end if
End Function

Public Function Form(Item)
if FormD.Exists(Item) then
Form=FormD(Item)
else
Form=""
end if
End Function

Public Function QueryString(Item)
QueryString=request.QueryString(Item)
End Function

Public Function Version()
Version=Ver
End Function

Public Function Error()
Error=Err
End Function

End Class
%>
tatty_bad 2005-01-10
  • 打赏
  • 举报
回复
Include上面的代码
然后用下面的这段代码处理
Set myrequest=new UploadClass
myrequest.MaxSize=500*1024
myrequest.FileType="jpg/gif/jpeg"
myrequest.Savepath="upload/"
myrequest.open
tatty_bad 2005-01-10
  • 打赏
  • 举报
回复
呵呵,用Stream》》》

你想自己机器上的东西传到自己的机器上???

<%
'----------------------------------------------------------
'转发时请保留此声明信息,这段声明不并会影响你的速度!
'******************* 风声上传类 V1.02 *******************
'作者:风声根据无惧上传类修改
'网站:http://www.17560.net
'邮件:Rumor@17560.net
'版权:版权全体,源代码公开,各种用途均可免费使用
'   但修改后必须把修改后的文件发送一份给作者
'**********************************************************
'----------------------------------------------------------
Class UpLoadClass

Private Ver,Err,FormD,FormStream,ItemStream
Dim MaxSize,FileType,SavePath,AutoSave

Private Sub Class_Initialize
MaxSize=150*1024
FileType="jpg/gif"
SavePath="UpLoadFile/"
AutoSave=true
Ver ="Rumor UpLoadClass Version 1.02"
Err=0
Set FormD = Server.CreateObject ("Scripting.Dictionary")
FormD.CompareMode = 1
Set FormStream=server.CreateObject("ADODB.Stream")
Set ItemStream=server.CreateObject("ADODB.Stream")
End Sub

Private Sub Class_Terminate
Set ItemStream=nothing
FormStream.Close()
Set FormStream=nothing
FormD.RemoveAll
Set FormD=nothing
End Sub

Public Sub Open()
Dim RequestSize,RequestData
RequestSize=Request.TotalBytes
if RequestSize<1 then
Err=4
Exit Sub
end if
RequestData=Request.BinaryRead(RequestSize)

Dim FormSize,CrLf,bCrLf,ListSeparator,LenListSep,FormData
FormStream.Type = 1
FormStream.Open
FormStream.Write RequestData
FormSize=FormStream.Size
bCrLf=ChrB(13)&ChrB(10)
Separator=MidB(RequestData,1,InstrB(1,RequestData,bCrLf)-1)

Dim pStart,pEnd,pTemp,ItemInfo,ItemName,ItemData
pStart=LenB(Separator)+2
Do
pEnd = InStrB (pStart,RequestData,bCrLf&bCrLf)+3
ItemStream.Type=1
ItemStream.Open
FormStream.Position=pStart
FormStream.CopyTo ItemStream,pEnd-pStart
ItemStream.Position=0
ItemStream.Type=2
ItemStream.Charset="gb2312"
ItemInfo=ItemStream.ReadText
ItemStream.Close()

pStart=pEnd
pEnd = InStrB (pStart,RequestData,Separator)-1
ItemStream.Type=1
ItemStream.Open
FormStream.Position=pStart
FormStream.CopyTo ItemStream,pEnd-pStart-2
ItemName=Mid(ItemInfo,39,Instr(39,ItemInfo,"""")-39)

if Instr(40,ItemInfo,"filename=""")>0 then
if ItemStream.Size<>0 then
Dim SourceFile,TargetFile
pTemp=52+Len(ItemName)
SourceFile=Mid(ItemInfo,pTemp,Instr(pTemp,ItemInfo,"""")-pTemp)
FormD.Add ItemName&"_Type",Mid(ItemInfo,Instr(pTemp,ItemInfo,"Content-Type: ")+14)
FormD.Add ItemName&"_Name",Mid(SourceFile,InstrRev(SourceFile,"\")+1)
FormD.Add ItemName&"_Path",Left(SourceFile,InstrRev(SourceFile,"\"))
if InstrRev(SourceFile,".")<>0 then
FormD.Add ItemName&"_Ext",Mid(SourceFile,InstrRev(SourceFile,".")+1)
else
FormD.Add ItemName&"_Ext",""
end if
FormD.Add ItemName&"_From",pStart
FormD.Add ItemName&"_Size",ItemStream.Size
FormD.Add ItemName&"_Err",0
if Instr(1,LCase("/"&FileType&"/"),LCase("/"&FormD(ItemName&"_Ext")&"/"))=0 then
if Err<2 then Err=Err+2
FormD(ItemName&"_Err")=FormD(ItemName&"_Err")+2
end if
if FormD(ItemName&"_Size")>MaxSize then
if Err<1 then Err=Err+1
FormD(ItemName&"_Err")=FormD(ItemName&"_Err")+1
end if
if FormD(ItemName&"_Err")=0 then
if AutoSave then
tarFileName=GetTimeStr()
if FormD(ItemName&"_Ext")<>"" then tarFileName=tarFileName&"."&FormD(ItemName&"_Ext")
FormD.Add ItemName,tarFileName
ItemStream.SaveToFile Server.MapPath(SavePath&tarFileName),2
else
FormD.Add ItemName,"Please save first"
end if
end if
else
FormD.Add ItemName,""
end if
else
ItemStream.Position=0
ItemStream.Type=2
ItemStream.Charset="gb2312"
ItemData=ItemStream.ReadText
if FormD.Exists(ItemName) then
FormD(ItemName) = FormD (ItemName)&","&ItemData
else
FormD.Add ItemName,ItemData
end if
end if

ItemStream.Close()
pStart = pEnd+LenB(Separator)+2
loop Until pStart+3>FormSize
End Sub

Public Function GetTimeStr()
GetTimeStr=Cstr(Date())&FormatNumber(Timer()*1000,0)
GetTimeStr=replace(replace(GetTimeStr,"-",""),",","")
End Function

Public Sub Save(Item,FileName)
if Not AutoSave and FormD.Exists(Item&"_From") then
if FormD(Item&"_Err")<>0 then
FormD(Item)=""
Exit Sub
End if
ItemStream.Type = 1
ItemStream.Open
FormStream.Position = FormD(Item&"_From")
FormStream.CopyTo ItemStream,FormD(Item&"_Size")
ItemStream.SaveToFile Server.MapPath(SavePath&FileName),2
ItemStream.Close()
FormD(Item)=FileName
end if
End Sub

Public Function GetData(Item)
GetData=""
if FormD.Exists(Item&"_From") then
if FormD(Item&"_Err")<>0 then Exit Function
FormStream.Position = FormD(Item&"_From")
GetData=FormStream.Read(FormD(Item&"_Size"))
end if
End Function

Public Function Form(Item)
if FormD.Exists(Item) then
Form=FormD(Item)
else
Form=""
end if
End Function

Public Function QueryString(Item)
QueryString=request.QueryString(Item)
End Function

Public Function Version()
Version=Ver
End Function

Public Function Error()
Error=Err
End Function

End Class
%>
calmer18 2005-01-10
  • 打赏
  • 举报
回复
http://www.51one.net/info/1206716825874625.htm
newhandtoo 2005-01-10
  • 打赏
  • 举报
回复
忘了告诉你,你使用这个stream对象只能上传本机的文件(即服务器)
stream对象只能拿本机的文件
zhmt 2005-01-10
  • 打赏
  • 举报
回复
你的压缩效率太高了,把文件都压缩蒸发了,强~~~
xayzmb 2005-01-10
  • 打赏
  • 举报
回复
不行啊!!!
zorou_fatal 2005-01-10
  • 打赏
  • 举报
回复
同楼上。

enctype="multipart/form-data"

声明为二进制方式post
newhandtoo 2005-01-10
  • 打赏
  • 举报
回复
<form name="FORM" action="AspTop0.asp" method="post" enctype="multipart/form-data">

28,390

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧