亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

利用ASP技術實現文件直接上傳功能

2019-11-18 19:19:26
字體:
來源:轉載
供稿:網友

  采用WEB技術實現B/S(瀏覽器/服務器)結構的管理系統是辦公自動化的發展趨勢?;赪EB技術的管理系統,由于開發周期短;與用戶平臺無關;易于實現交互式應用;能對信息進行快速、高效的收集、處理和發布,近幾年來得到了迅速發展。而asp技術由于其開發效率高、交互性好,安全性強等特點,逐漸成為開發管理系統的首選工具。

  許多基于WEB的應用都涉及文件上傳操作。常見的文件上傳技術有:基于HTTP協議的;基于VB(或DELPHI等編程語言)開發的文件上傳組件的;基于數據庫技術的等等。這些方法一般都需要編程者能同時掌握WEB技術、數據庫技術或CGI技術或組件技術,對編程者的要求較高。而本文將介紹的利用ASP技術直接實現文件上傳功能則只需編程者掌握單一的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技術即可,

  大大降低了編程難度。下面我們將通過一個實例來介紹如何使用該方法。

  1、文件上傳表單

  首先需要編寫一個能提供文件上傳功能的表單,程序如下所示:

<Form action="upload.asp" method=post enctype="mult上傳文件:<Input type=file name=file1><br>
<input type=submit name=upload value="上傳">
</form>

  其中,enctype參數用來設置表單的MIME編碼方式,在進行文件(或同時包含文本框)上傳時,必須將其屬性設置為"multipart/form-data";upload.asp是服務器端對接收到的二進制文件流進行處理的ASP程序,在本文的后面將陸續介紹其內容。

  2、上傳文件格式分析

  在處理文件之前,我們要先了解上傳的文件的具體格式,通過編寫下面一段簡單的ASP程序就可以查看其二進制代碼:

<%
filesize=Request.TotalBytes '獲得上傳文件的大小
filedata=Request.BinaryRead(filesize) '獲得上傳文件的二進制數據
Response.BinaryWrite filedata '在瀏覽器上顯示二進制數據
%>

  分析瀏覽器上顯示的上傳文件的二進制代碼,發現代碼包括四個部分(若同時上傳多個文件或文本框,則代碼按上傳的先后次序排列,格式相同),每一部分的內容是用回車換行符號來進行分隔的:

  1)第一部分(起始標志)
  -----------------------------7d329631b04d4
  2)第二部分(文件說明)

Content-Disposition: form-data; name="file1"; filename="C:/Documents and Settings/Administrator/My Documents/Invitation.doc" Content-Type: application/msWord

  在此,我們可以獲得上傳文件的文件名稱及絕對路徑,也可以獲得文件類型。這些信息是正確保存文件所不可缺少的。
  
  3)第三部分(文件內容)

  即文件的二進制內容,略。

  4)第四部分(結束標志)

-----------------------------7d329631b04d4

  結合第一部分和第四部分的內容來看,"-----------------------------7d329631b04d4"(每次上傳,數值都不一樣)起到了分割符的作用,它標志著一段數據(當有多個上傳內容時)的開始和結束。從保存文件所需要的信息來講,我們首先需要從第二部分數據的"filename"中獲得文件名稱,然后需要正確定位文件的起始位置,最后利用ASP技術將二進制文件用本來的文件名保存即可。若同時上傳多個內容(如多個文本框和文件),也是按同樣的方法處理,每部分的內容都包含在分割符之中,只是文本框和文件的表現形式稍有不同,這可以通過具體分析其二進制代碼來了解。

  3、利用ASP技術實現文件存儲

  上傳文件代碼的處理

  1) 獲得分割符代碼

  從上面的分析我們已經知道,分割符起到了分割多個數據段(包括文本框和各種類型的文件)的重要作用。前面已經分析過,分割符出現在第一個回車換行符號前。因此,通過下面這段程序就可獲得分割符代碼:

<%
newline=chrB(13) & chrB(10) 'newline表示二進制的回車符
filesize=Request.TotalBytes 'filesize是上傳文件的大小
filedata=Request.BinaryRead(filesize) 'filedata是上傳文件的二進制數據
divider=leftB(filedata,clng(instrb(filedata,newline))-1) 'divider是分割符
%>

  注:因為這里處理的都是二進制字節碼,因此,所有的函數都是使用它的二進制版本,加了"b "。

  2) 獲得文件(或文本框)內容

  (1) 預備函數(將二進制串轉化成字符串)

  上傳文件的內容不需要經過二進制向字符串的轉換過程,直接保存就可。但是,若需提取文本框內容或文件的名稱,就必須進行轉換。因此,需要編寫一個通用的,并且適用于漢字的轉換函數。以下是該函數代碼:

Function BtoS (bstr)
If not Is Null (bstr) Then
for i = 0 to lenb(bstr) - 1
bchr = midb(bstr,i+1,1)
If ascb(bchr)>127 Then '漢字是雙字節,得兩個字符一起處理
temp = temp&chr(ascw(midb(bstr, i+2, 1)&bchr))
i = i+1
Else
temp = temp&chr(ascb(bchr))
End If
next
End If
BtoS = temp
End Function 

  (2) 獲得文件(或文本框)內容

  在實際的WEB應用中,上傳操作可能涉及多項內容,如多個文本框、多個文件等等。文件和文本框很好區分,文件的數據中包含了"filename="字串。因此,我們寫了如下的通用函數,既可用于提取文件內容,又可提取文本框內容(需進行二進制轉換):

Function getdata(byval data, byval divider, final) 'data表示二進制串;divider表示分割符;final表示數據的結束位置
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34) '字符串"filename"的二進制表示
bncrlf=chrb(13)&chrb(10) '二進制的回車符
startpos = instrb(data,divider)+lenb(divider)+lenb(bncrlf) ' 開始位置
endpos = instrb(startpos,data, divider)-lenb(bncrlf) '結束位置
part1 = midb(data, startpos, endpos-startpos) '兩個分割符之間的內容
firstline = midb(part1, 1, instrb(part1, bncrlf)-1) ' 內容之前的說明段
If (instrb(firstline,filename)=0) Then '若為文本框,獲得文本框字符串內容
stemp=midb(part1,instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf),lenb(part1)-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
getdata=BtoS(stemp)
Else '若為文件,獲得文件二進制內容
Getdata=midb (part1, instrb (part1, bncrlf&bncrlf)+lenb (bncrlf&bncrlf), lenb (part1)
-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
End If
Final=endpos
End function

  在程序中直接調用該函數就可獲得所需文件(或文本框)內容,如下所示:

<%
Content=getdata (data, divider, position)
%>

  3) 獲得文件名稱
  前面已經分析過了,上傳文件數據流的"filename="字段里包含了文件的名稱和絕對路 徑。一般來說,我們只需提取出路徑中的文件名即可,以下是程序代碼:

<%
namepos=instrrev(B2S(firstline),chr(92)) 'firstline即上面獲得的說明部分數據,chr(92)
表示"/"
filename=midb(firstline,namepos+1,lenb(firstline)-namepos-1) '獲得文件名稱
%>

  利用ASP直接實現文件上傳功能

  傳統的ASP程序員只能利用FILESYSTEMOBJECT對象對文本文件(.txt)進行移動、復制、刪除等操作,若需處理二進制對象,則不得不采用本文前面介紹的那些方法來實現。但是,現在ASP中的ADO.STREAM對象可以同時操作文本對象和二進制對象(可以在http://www.microsoft.com/data下載),利用它就可以在ASP中直接實現文件上傳功能。下面,我們就介紹其實現過程。

  1)打開STREAM對象

  對于SREAM對象而言,若要進行文件的保存,則必須是將該對象的全部內容進行保存。因此,我們必須要創建兩個(或多個)STREAM對象,其中一個為源數據流,即接收初始的二進制數據;另一個為目的數據流,即接收來自經源數據流處理后的數據,并最終保存為所需的文件。

<%
set str=server.CreateObject("ADODB.Stream") 'str為源數據流
str.Mode=3 '設置打開模式,3為可讀可寫
str.Type=1 '設置數據類型,1為二進制數據
str.Open
set desc=server.CreateObject("ADODB.Stream") 'desc為目標數據流
desc.Mode=3
Desc.Type=1
desc.Open
%>

  2)STEAM對象間內容的復制

  在該部分,必須在源數據流中定位文件開始的位置,并且求出文件內容的長度,才能將文件正確的復制到目的數據流中,并且保存文件,程序代碼如下:

<%
formdata=Request.BinaryRead(Request.TotalBytes) 'formdata為上傳的所有內容
str.Write formdata ' 賦值源數據流
str.position=count-lenb(result)-2 'position指出文件的開始位置
str.copyto desc, lenb(filecotent) 'lenb(filecontent)表示文件的長度
desc.SaveToFile fullpath,2 '以fullpath指定的路徑及名稱保存文件
%>

  3)關閉STEAM對象

  編程完成后,應關閉并釋放STEAM對象,如下所示:

<%
Desc. Close
Set desc=nothing
Str. Close
Set STR=nothing
%>

  總結

  本文給出了利用ASP直接實現文件上傳的方法,在本單位自行開發的信息管理系統中得到了很好的應用。實踐證明:與傳統的幾種文件上傳方法相比,該方法更簡便、更高效。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天堂av网| 亚洲人成伊人成综合网久久久| 久久久成人精品视频| 日韩在线视频线视频免费网站| 国产精品高潮粉嫩av| 日韩最新av在线| 2019av中文字幕| 91产国在线观看动作片喷水| 国内精品久久久| 不卡av电影在线观看| 久久久99久久精品女同性| 国产精品揄拍500视频| 国产一区av在线| 福利一区福利二区微拍刺激| 欧美精品videossex88| 4p变态网欧美系列| 久久精品这里热有精品| 国产精品极品美女在线观看免费| 尤物tv国产一区| 精品久久久久久久久久国产| 91国语精品自产拍在线观看性色| 欧美激情国内偷拍| 欧美激情视频一区二区三区不卡| 欧美性理论片在线观看片免费| 九九精品在线观看| 日av在线播放中文不卡| 尤物yw午夜国产精品视频| 91av视频在线观看| 亚洲成色999久久网站| 中国人与牲禽动交精品| 亚洲欧美成人精品| 色综合视频一区中文字幕| 狠狠躁18三区二区一区| 欧美老女人www| 国产精欧美一区二区三区| 久久久久国产一区二区三区| 久久亚洲精品网站| 亚洲美女激情视频| 国产精品久久久久久久天堂| 久久成年人免费电影| 亚洲自拍欧美色图| 欧美精品videosex牲欧美| 亚洲欧洲一区二区三区久久| 91精品中文在线| 97久久久免费福利网址| 久久精品亚洲国产| 日韩精品免费在线观看| 中文字幕日韩电影| 国产精品影院在线观看| 成人女保姆的销魂服务| 97视频com| 久热精品视频在线观看| 亚洲视频999| 亚洲91av视频| 亚洲最新中文字幕| 久久精品电影网| 精品亚洲aⅴ在线观看| 九九视频这里只有精品| 日本在线精品视频| 日韩欧美精品网站| 日韩精品中文字幕在线观看| 国产美女91呻吟求| 日韩欧美极品在线观看| 亚洲美腿欧美激情另类| 国产精品第七十二页| 精品国模在线视频| 国内精品一区二区三区四区| 欧美在线视频观看免费网站| 国产不卡一区二区在线播放| 欧美高清第一页| 日日噜噜噜夜夜爽亚洲精品| 九九热r在线视频精品| 中文字幕视频一区二区在线有码| 日韩一区二区三区在线播放| 久久免费在线观看| 亚洲美女自拍视频| 激情懂色av一区av二区av| 久久天天躁狠狠躁夜夜爽蜜月| 欧美一区二区三区艳史| 岛国视频午夜一区免费在线观看| 91精品国产高清久久久久久91| 久久精品国产电影| 欧美激情久久久久久| 久久久久久久久亚洲| 欧美精品生活片| 成人免费在线网址| 色综合老司机第九色激情| 亚洲精品福利视频| 青青久久av北条麻妃海外网| 国产欧美日韩精品丝袜高跟鞋| 国产精品都在这里| 国产精品丝袜高跟| 精品久久久久久久久中文字幕| 亚洲天堂开心观看| 麻豆精品精华液| 庆余年2免费日韩剧观看大牛| 亚洲奶大毛多的老太婆| 日本欧美精品在线| 国产精品美女视频网站| 国产精品日韩久久久久| 国产精品久久久久久久久久新婚| 亚洲欧洲高清在线| 欧美激情第一页xxx| 欧美一二三视频| 欧美第一黄网免费网站| 亚洲一级黄色av| 日韩av黄色在线观看| 亚洲福利在线观看| 亚洲变态欧美另类捆绑| 亚洲区一区二区| 欧美激情在线播放| 视频在线观看一区二区| 91国语精品自产拍在线观看性色| 欧美国产亚洲精品久久久8v| 成人xxxx视频| 中文字幕日韩专区| 日韩av在线影院| 国产精品久久久久久久久久三级| 国产精品久久久久国产a级| 精品香蕉在线观看视频一| 久久精品视频在线| 亚洲国产欧美一区| 日韩大陆欧美高清视频区| 日韩欧美亚洲一二三区| 91精品啪在线观看麻豆免费| 91成人天堂久久成人| 91中文在线视频| 91免费高清视频| 国产日韩在线视频| 97婷婷大伊香蕉精品视频| 91深夜福利视频| 欧美精品18videos性欧美| 久久国内精品一国内精品| 久久久久久亚洲| 精品国产一区二区三区在线观看| 青青精品视频播放| 欧美影院在线播放| 国产精品青青在线观看爽香蕉| 亚洲午夜未满十八勿入免费观看全集| 国产日韩欧美日韩大片| 国产成人在线亚洲欧美| 亚洲成人久久网| 中文字幕免费精品一区高清| 久久久久久久久亚洲| 欧美另类极品videosbest最新版本| 精品丝袜一区二区三区| 91日本视频在线| 亚洲国产日韩欧美综合久久| 精品国产一区二区三区久久狼黑人| 国产精品国语对白| 国产日韩中文字幕在线| 国产精品综合久久久| 欧美自拍视频在线| 国产欧美va欧美va香蕉在| 一本一本久久a久久精品牛牛影视| 亚洲专区在线视频| 亚洲欧美日韩中文在线制服| 热99精品里视频精品| 综合国产在线观看| 欧美视频免费在线观看| 亚洲大胆人体视频| 欧美国产第二页| 最近2019年中文视频免费在线观看| 51久久精品夜色国产麻豆|