//Author: William Lin
//Date: 2009-02-26
//QQ: 22967225
//Description: 用Asp上传多个附件,修改附件
一直以来都用.net开发居多,最近有位客户委托修改一个涉及文档管理系统,就是管理公司内部的一些文档用的,涉及到Asp上传一个或多个附件的功能。简单做了一下。
1) 网上找了一个 upload_5xsoft.inc
/*** start 新增操作 ****/
2) 前台显示页,主要代码
<td id="tdUpfileID"><input name="upfile" type="file" id="upfile" size="40"><a href="#" onClick="CreateObj()">+</a> </td>
<script language="javascript">
var theCount =1;
function CreateObj()
{
var board = document.getElementById("tdUpfileID");
var newNode = document.createElement("<br>");
var e = document.createElement("input");
e.type = "file";
e.size = 40;
//这里要注意,一定要保证upfile的Name都是不同的 否则最后 只会上传第一个upfile文件
e.name = "upfile" + theCount;
board.appendChild(newNode);
board.appendChild(e);
theCount++;
return false;
}
</script>
后台提交页面
<!--#include file="inc/upload_5xsoft.inc" -->
<%
Dim upload
Dim file,filepath,db_filePath,formName,fname
set upload=new upload_5xSoft ''建立上传对象
filepath="upload/"
Dim strArrayFileName
strArrayFileName = ""
For each formName in upload.file ''列出所有上传了的文件
set file=upload.file(formName) ''生成一个文件对象
fname = ""
If file.FileSize>0 then
fname = file.filename ''如果 FileSize > 0 说明有文件数据
file.SaveAs Server.mappath(filepath&fname) ''保存文件
If strArrayFileName = "" Then
strArrayFileName = fname
Else
strArrayFileName = strArrayFileName & "|" &fname '' 把上传的文件名 拼接一下,用 | 分隔符
End If
End if
set file=nothing
Next
Response.Clear()
'=========最后做数据库操作
Dim sql
Dim rs
sql = "select * from tableName"
set rs=server.CreateObject("adodb.recordset")
rs.Open sql,conn,3,3
rs("qFilePath") = strArrayFileName
rs.Update
%>
/*** End 新增操作 ****/
/*** start 修改操作 ****/
前台主要代码
//用一个隐藏按钮,保持原有的 文件名拼接字符串
<input name="txtOldAffix" type="hidden" id="txtOldAffix" value="<%=rsRecord_ById("theFilePath")%>">
//显示上传的所有 文件
<table width="95%" border="0">
<%
strArrayFileName = rsRecord_ById("qFilePath")
arrayFileName = Split(strArrayFileName,"|")
maxBound=Ubound(arrayFileName) '默认数组长度
kNub = 1
For i=0 to maxBound
If arrayFileName(i) = "" Then
displayState = "none;"
Else
displayState = ""
End If
%>
<tr id="trFile<%=i%>" style="display:<%=displayState%>">
<td> ■ <a target="_blank" href="upload/<%=arrayFileName(i)%>"><%=arrayFileName(i)%></a> <br></td>
<td> <a href="#" onClick="DeleteOldFile('<%=(i)%>','trFile<%=i%>')" title="Delete" > X </a></td>
</tr>
<%
kNub = kNub + 1
Next
%>
</table>
<script lanuage="javascript">
var strOldFile = document.myform.txtOldAffix.value.split("|");
function DeleteOldFile(index,trId) //点击X,隐藏当前行的 文件信息
{
strOldFile[index] = "";
//document.myform.txtTemp2.value = strOldFile;
document.myform.txtOldAffix.value = strOldFile;
var objHref = document.getElementById(trId);
objHref.style.display = "none";
}
</script>
后台代码
rsWorkIntro("qFilePath") = Replace(upload.form("txtOldAffix"), ",", "|") & strArrayFileName
================
upload_5xsoft.inc 代码如下
<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT CODEPAGE=936>
dim oUpFileStream,time1
Class upload_5xSoft
dim Form,File,Version
Private Sub Class_Initialize
dim RequestBinDate,sStart,bCrLf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,oFileInfo
dim iFileSize,sFilePath,sFileType,sFormvalue,sFileName
dim iFindStart,iFindEnd
dim iFormStart,iFormEnd,sFormName
Version="无组件上传类 Version 0.93"
set Form=Server.CreateObject("Scripting.Dictionary")
set File=Server.CreateObject("Scripting.Dictionary")
if Request.TotalBytes<1 then Exit Sub
set tStream = Server.CreateObject("adodb.stream")
set oUpFileStream = Server.CreateObject("adodb.stream")
oUpFileStream.Type = 1
oUpFileStream.Mode =3
oUpFileStream.Open
oUpFileStream.Write Request.BinaryRead(Request.TotalBytes)
'Response.Write "<font size=""2"">times:"&FormatNumber((Timer() -time1)*1000,3)&"毫秒</font><br>"
Response.Write "<font size=""2"">times:"&FormatNumber((Timer() -time1)*1000,3)&"mSeconds</font><br>"
Response.Write "<font size=""2""><a href='upload.htm'>upload</a> "
oUpFileStream.Position=0
RequestBinDate =oUpFileStream.Read
iFormStart = 1
iFormEnd = LenB(RequestBinDate)
bCrLf = chrB(13) & chrB(10)
sStart = MidB(RequestBinDate,1, InStrB(iFormStart,RequestBinDate,bCrLf)-1)
iStart = LenB (sStart)
iFormStart=iFormStart+iStart+1
while (iFormStart + 10) < iFormEnd
iInfoEnd = InStrB(iFormStart,RequestBinDate,bCrLf & bCrLf)+3
tStream.Type = 1
tStream.Mode =3
tStream.Open
oUpFileStream.Position = iFormStart
oUpFileStream.CopyTo tStream,iInfoEnd-iFormStart
tStream.Position = 0
tStream.Type = 2
tStream.Charset ="gb2312"
sInfo = tStream.ReadText
'取得表单项目名称
iFormStart = InStrB(iInfoEnd,RequestBinDate,sStart)
iFindStart = InStr(22,sInfo,"name=""",1)+6
iFindEnd = InStr(iFindStart,sInfo,"""",1)
sFormName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
'如果是文件
if InStr (45,sInfo,"filename=""",1) > 0 then
set oFileInfo=new FileInfo
'取得文件名
iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10
iFindEnd = InStr(iFindStart,sInfo,"""",1)
sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
oFileInfo.FileName=getFileName(sFileName)
oFileInfo.FilePath=getFilePath(sFileName)
'取得文件类型
iFindStart = InStr(iFindEnd,sInfo,"Content-Type: ",1)+14
iFindEnd = InStr(iFindStart,sInfo,vbCr)
oFileInfo.FileType =Mid (sinfo,iFindStart,iFindEnd-iFindStart)
oFileInfo.FileStart =iInfoEnd
oFileInfo.FileSize = iFormStart -iInfoEnd -3
oFileInfo.FormName=sFormName
file.add sFormName,oFileInfo
else
'如果是表单项目
tStream.Close
tStream.Type =1
tStream.Mode =3
tStream.Open
oUpFileStream.Position = iInfoEnd
oUpFileStream.CopyTo tStream,iFormStart-iInfoEnd-3
tStream.Position = 0
tStream.Type = 2
tStream.Charset ="gb2312"
sFormvalue = tStream.ReadText
form.Add sFormName,sFormvalue
end if
tStream.Close
iFormStart=iFormStart+iStart+1
wend
RequestBinDate=""
set tStream =nothing
End Sub
Private Sub Class_Terminate
if not Request.TotalBytes<1 then
form.RemoveAll
file.RemoveAll
set form=nothing
set file=nothing
oUpFileStream.Close
set oUpFileStream =nothing
end if
End Sub
Private function GetFilePath(FullPath)
If FullPath <> "" Then
GetFilePath = left(FullPath,InStrRev(FullPath, "/"))
Else
GetFilePath = ""
End If
End function
Private function GetFileName(FullPath)
If FullPath <> "" Then
GetFileName = mid(FullPath,InStrRev(FullPath, "/")+1)
Else
GetFileName = ""
End If
End function
End Class
Class FileInfo
dim FormName,FileName,FilePath,FileSize,FileType,FileStart
Private Sub Class_Initialize
FileName = ""
FilePath = ""
FileSize = 0
FileStart= 0
FormName = ""
FileType = ""
End Sub
Public function SaveAs(FullPath)
dim oFileStream,ErrorChar,i
SaveAs=1
if trim(fullpath)="" or right(fullpath,1)="/" then exit function
set oFileStream=CreateObject("Adodb.Stream")
oFileStream.Type=1
oFileStream.Mode=3
oFileStream.Open
oUpFileStream.position=FileStart
oUpFileStream.copyto oFileStream,FileSize
oFileStream.SaveToFile FullPath,2
oFileStream.Close
set oFileStream=nothing
SaveAs=0
end function
End Class
</SCRIPT>