台灣最大程式設計社群網站
線上人數
448
 
會員總數:245785
討論主題:189420
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> 不需使用原件圖文混合上傳,無須資料庫,支援中文
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
不需使用原件圖文混合上傳,無須資料庫,支援中文
價值 : 0 QP  點閱數:1527 回應數:0
樓主

站務人員 站長
門外漢
0 1580
542 9
發送站內信

捐贈 VP 給 站務人員
真正無組件圖文混合上傳,無須資料庫,支援中文!

該程式支援任何文本和二進製格式文件的上傳;支援文件表單域和普通表單域混合上傳;支援中文文件名;支援覆蓋上傳和文件同名時自動修改文件名;支援同時上傳多個文件,而且多個文件表單域名可以相同;支援上傳文件大小的控製 我自己感覺很不錯喲:)
本程式無須任何資料庫支援,直接將上傳的文件保存到服務器指定的路徑下。
測試環境:Windows2000 + IIS 5.0(對ADO版本有要求)
已知BUG:利用相同文件表單名以唯一文件名方式同時上傳多個文件,且服務器上存在多個相同文件名時,隻有第一個文件會自動改名上傳成功,然後程式報錯。
源代碼如下,歡迎大家參考指正:

文件名:UploadX.asp
<%
Dim FormData, FormSize, Divider, bCrLf
FormSize = Request.TotalBytes
FormData = Request.BinaryRead(FormSize)
bCrLf = ChrB(13) & ChrB(10)
Divider = LeftB(FormData, InStrB(FormData, bCrLf) - 1)

'將上傳的文件保存到path所指定的目錄下面。
'Formfield 上傳表單的"file"域名
'Path 要保存文件的服務器絕對路徑,形式為:"d:\path\subpath"或"d:\path\subpath\"
'MaxSize 限制上傳文件的最大長度,以KByte為單位
'SavType 服務器保存文件的方式:
' 0 唯一文件名方式,如果有同名則自動改名;
' 1 報錯方式,如果有同名則出錯;
' 2 覆蓋方式,如果有同名則覆蓋原來的文件
Function SaveFile(FormFileField, Path, MaxSize, SavType)
Dim StreamObj,StreamObj1
Set StreamObj = Server.CreateObject("ADODB.Stream")
Set StreamObj1 = Server.CreateObject("ADODB.Stream")
StreamObj.Mode = 3
StreamObj1.Mode = 3
StreamObj.Type = 1
StreamObj1.Type = 1
SaveFile = ""
StartPos = LenB(Divider) + 2
FormFileField = Chr(34) & FormFileField & Chr(34)
If Right(Path,1) <> "\" Then
Path = Path & "\"
End If
Do While StartPos > 0
strlen = InStrB(StartPos, FormData, bCrLf) - StartPos
SearchStr = MidB(FormData, StartPos, strlen)
If InStr(bin2str(SearchStr), FormFileField) > 0 Then
FileName = bin2str(GetFileName(SearchStr,path,SavType))
If FileName <> "" Then
FileStart = InStrB(StartPos, FormData, bCrLf & bCrLf) + 4
FileLen = InStrB(StartPos, FormData, Divider) - 2 - FileStart
If FileLen <= MaxSize*1024 Then
FileContent = MidB(FormData, FileStart, FileLen)
StreamObj.Open
StreamObj1.Open
StreamObj.Write FormData
StreamObj.Position=FileStart-1
StreamObj.CopyTo StreamObj1,FileLen
If SavType =0 Then
SavType = 1
End If
StreamObj1.SaveToFile Path & FileName, SavType
StreamObj.Close
StreamObj1.Close
If SaveFile <> "" Then
SaveFile = SaveFile & "," & FileName
Else
SaveFile = FileName
End If
Else
If SaveFile <> "" Then
SaveFile = SaveFile & ",*TooBig*"
Else
SaveFile = "*TooBig*"
End If
End If
End If
End If
If InStrB(StartPos, FormData, Divider) < 1 Then
Exit Do
End If
StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2
Loop
End Function

Function GetFormVal(FormName)
GetFormVal = ""
StartPos = LenB(Divider) + 2
FormName = Chr(34) & FormName & Chr(34)
Do While StartPos > 0
strlen = InStrB(StartPos, FormData, bCrLf) - StartPos
SearchStr = MidB(FormData, StartPos, strlen)
If InStr(bin2str(SearchStr), FormName) > 0 Then
ValStart = InStrB(StartPos, FormData, bCrLf & bCrLf) + 4
ValLen = InStrB(StartPos, FormData, Divider) - 2 - ValStart
ValContent = MidB(FormData, ValStart, ValLen)
If GetFormVal <> "" Then
GetFormVal = GetFormVal & "," & bin2str(ValContent)
Else
GetFormVal = bin2str(ValContent)
End If
End If
If InStrB(StartPos, FormData, Divider) < 1 Then
Exit Do
End If
StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2
Loop
End Function

Function bin2str(binstr)
Dim varlen, clow, ccc, skipflag
skipflag = 0
ccc = ""
varlen = LenB(binstr)
For i = 1 To varlen
If skipflag = 0 Then
clow = MidB(binstr, i, 1)
If AscB(clow) > 127 Then
ccc = ccc & Chr(AscW(MidB(binstr, i + 1, 1) & clow))
skipflag = 1
Else
ccc = ccc & Chr(AscB(clow))
End If
Else
skipflag = 0
End If
Next
bin2str = ccc
End Function

Function str2bin(str)
For i = 1 To Len(str)
str2bin = str2bin & ChrB(Asc(Mid(str, i, 1)))
Next
End Function

Function GetFileName(str,path,savtype)
Set fs = Server.CreateObject("Scripting.FileSystemObject")
str = RightB(str,LenB(str)-InstrB(str,str2bin("filename="))-9)
GetFileName = ""
FileName = ""
For i = LenB(str) To 1 Step -1
If MidB(str, i, 1) = ChrB(Asc("\")) Then
FileName = MidB(str, i + 1, LenB(str) - i - 1)
Exit For
End If
Next
If savtype = 0 and fs.FileExists(path & bin2str(FileName)) = True Then
hFileName = FileName
rFileName = ""
For i = LenB(FileName) To 1 Step -1
If MidB(FileName, i, 1) = ChrB(Asc(".")) Then
hFileName = LeftB(FileName, i-1)
rFileName = RightB(FileName, LenB(FileName)-i+1)
Exit For
End If
Next
For i = 0 to 9999
'hFileName = hFileName & str2bin(i)
If fs.FileExists(path & bin2str(hFileName) & i & bin2str(rFileName)) = False Then
FileName = hFileName & str2bin(i) & rFileName
Exit For
End If
Next
End If
Set fs = Nothing
GetFileName = FileName
End Function
%>

應用舉例:

upload.htm

<html>

<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>New Page 1</title>
</head>

<body>

<form method="POST" action="upload.asp" enctype="multipart/form-data">
<p>姓名:<input type="text" name="name" size="20"></p>
<p>城市:<input type="text" name="city" size="20"></p>
<p>愛好:1、<input type="text" name="lover" size="10"> 2、<input type="text" name="lover" size="10"></p>
<p>性別:<input type="radio" value="男" checked name="sex">男
<input type="radio" name="sex" value="女">女</p>
<p>省份:<select size="1" name="province">
<option selected value="屏東">屏東</option>
<option value="高雄">高雄</option>

</select></p>
愛好(補充):3、<input type="text" name="lover" size="10"> 4、<input type="text" name="lover" size="10">
<p>作品1:<input type="file" name="fruit" size="20"></p>
<p>作品1:<input type="file" name="fruit" size="20"></p>
<p>作品2:<input type="file" name="fruit2" size="20"></p>
<p><input type="submit" value="提交" name="subbutt"><input type="reset" value="全部重寫" name="rebutt"></p>
</form>

</body>

</html>


upload.asp

<%@ LANGUAGE = VBScript %>
<!-- #include file="uploadx.asp" -->
<%
Response.Write "Name=""" & GetFormVal("name") & """"
Response.Write "Sex=""" & GetFormVal("sex") & """"
Response.Write "province=""" & GetFormVal("province") & """"
Response.Write "city=""" & GetFormVal("city") & """"
Response.Write "lover=""" & GetFormVal("lover") & """"
dim filename
path = Server.MapPath("./")
filename = SaveFile("fruit",path,1024,0)
If filename <> "*TooBig*" Then
Response.Write """" & filename & """已經上傳"
Else
Response.Write "文件超出限制太大"
End IF

filename = SaveFile("fruit2",path,1024,0)
If filename <> "*TooBig*" Then
Response.Write """" & filename & """已經上傳"
Else
Response.Write "文件超出限制太大"
End IF
%>

本篇文章發表於2002-06-05 00:00
目前尚無任何回覆
   

回覆
如要回應,請先登入.