亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 用DELPHI為ASP開發文件上載組件 (2000年.txt

?? 自己對DELPHI學習的一點體會
?? TXT
字號:
用DELPHI為ASP開發文件上載組件 (2000年12月6日) 

本站更新  分類:   作者:王發軍  推薦:   閱讀次數:619  
(http://www.codesky.net)  

--------------------------------------------------------------------------------
  
  ASP(Active Server Page)是微軟公司的產品,由于它編程很容易上手,能快速開發功能強大的
動態網站,現在很多網站(特別是Intranet/Extranet內部網)采用了NT+IIS+ASP的模式,
使得ASP成為目前較為流行的網站開發腳本語言。在WEB服務中,文件上載服務是一個很常見的
功能,而WIN9X下的PWS沒有提供相關組件;NT下的IIS提供了一個Post Acceptor組件,
但由于它要檢查用戶的WWW訪問權限而變得不太好用;也可以從Internet上下載有關組件,但這些
大多都是商業組件,用于下載的是試用版,在使用時間或功能上都有限制。由于ASP可以調用標準
的OLE/COM組件,我們可以用VB/VC/DELPHI等高級編程工具根據我們自己的要求
來定制自己的ASP文件上載組件,滿足自己的應用系統要求。
  下面將討論用DELPHI為ASP開發文件上載組件的原理和具體實現過程。

一、文件上載的實現原理
  基于Web方式數據上傳,要遵從RFC1867標準,上載的文件數據也不例外。如用下面HTML頁面
文件(delphiup.htm)選擇上載文件:


用DELPHI編寫的文件上載組件實現文件上載



文件另存為:


請要選擇上載的文件:
 





  當客戶端選擇了一個文件(如Test.TXT,其內容為“這里是一個用于上載的文件的內容。”)并按
“確認上載”按鈕提交數據后,服務器端程序收到的數據將具有如下形式:
-----------------------------7cf1d6c47c#13#10
Content-Disposition: form-data; name="SaveAs"#13#10#13#10
NewFileName#13#10
-----------------------------7cf1d6c47c#13#10
Content-Disposition: form-data; name="FileData"; filename="D:\test.txt" 
Content-Type: text/plain#13#10#13#10
這里是一個用于上載的文件的內容。#13#10
-----------------------------7cf1d6c47c#13#10
Content-Disposition: form-data; name="b1"#13#10#13#10
確認上載#13#10
-----------------------------7cf1d6c47c-- 
其中,“-----------------------------7cf1d6c47c”是分界符,用于分隔表單(Form)中的各個域;
#13#10是回車換行符的DELPHI表示。我們可以這樣認為,每個表單域的信息描述,都是以分界
符加一對回車換行符#13#10開始;表單域名以“name="”開始,以“"”為結束;表單域值以兩對回車
換行符#13#10#13#10開始,以一對回車換行符#13#10#加分界符結束;文件名稱以“filename="”開始,
以“"”為結束。有了這些標志,我們就可以獲取表單域的名稱和值以及要上載的文件的名稱,從而實
現文件數據的讀取和存儲了。

二、文件上載的實現過程
  在理解上面提到的數據格式后,自己動手編寫一個文件上載組件對我們來說已經不是困難了。

  (一)開始建立一個ASP組件的工程
     如果您對用DELPHI開發OLE Automation Server的步驟不太熟悉的話,請參見《電子與
電腦》1999年第06期的一篇文章《用DELPHI開發用于ASP的OLE Automation Server 》。
這里只簡要介紹一下操作步驟。
  1、建立ActiveX Library工程
  在DELPHI中選擇菜單File=》New...,在“New Item”對話框的ActiveX選項卡中選擇
“ActiveX Library”,DELPHI會自動創建一個DLL工程Project1。
  2、建立Automation組件
  在DELPHI中選擇菜單File=》New...,在“New Item”對話框的ActiveX選項卡中選
擇“Automation Object”;然后在“Automation Object Wizard”對話框中輸入Class Name
(如“UploadFile”),Instancing選擇“Multiple Instance”即可,單擊“OK”后DELPHI會自動
創建一個TLB(Type Library)文件Project1_TLB.PAS和一個PAS(Unit)文件Unit1.PAS。在Type 
Library設計窗口中,將Project1改名為MyUpload,則該文件上載組件的OLE注冊碼為“MyUpload.UploadFile”。
  3、引入ASP類型庫
  為了使用ASP的五個內建對象(Request、Response、Server、Application、Session),需要引入
ASP類型庫。我們主要利用Request對象讀取從客戶端傳遞到服務器端的數據。
  在Project菜單中選擇“Import Type Library”,在“Import Type Library”對話框的“Type 
Libraries”列表選擇“Microsoft Active Server Pages Object Library(Version 2.0)”(如果沒有這
個選項,請確定您的計算機上安裝了IIS3以上或PWS4以上并且ASP.DLL已正確注冊),DELPHI
會自動創建一個TLB文件ASPTypeLibrary_TLB.PAS,其中有我們需要的ASP對象類型聲明。
  4、定義OnStartPage、OnEndPage過程
  當在ASP頁面上用Server.CreateObject創建一個OLE對象實例時,WEB服務器會調用其方法
OnStartPage,將ASP應用環境信息傳遞給該對象,我們可以在該過程中獲取客戶端信息;當在ASP
頁面中釋放一個OLE對象實例時,WEB服務器會調用其方法OnEndPage,我們可以在該過程中進行釋放
內存等結束操作。在我們這個組件中,我們要用到其OnStartPage方法。
  OnStartPage方法應該在Unit1.PAS中定義,OnStartPage的函數原型為:
procedure OnStartPage(AScriptingContext: IUnknown);
其中參數AScriptingContext是一個IScriptingContext類型變量,包含五個屬性(Request、Response、
Server、Application、Session)分別對應ASP的五個內建同名對象。
  我們需要在TLB定義窗口(View=》Type Library)中,為IUploadFile增加方法OnStartPage,其
Declaration語句為“procedure OnStartPage(AScriptingContext: IUnknown);”。

  (二)提取客戶端上傳的數據
  該工作可以放在OnStartPage過程中進行。
  利用AScriptingContext的屬性Request(類型為IRequest)中的屬性TotalBytes(請求信息內容長度)
和方法BinaryRead可將客戶端上傳的請求信息數據讀取到一個Byte類型的數組中,然后按RFC1867標準定
義的數據格式來分析和提取數據。
  1、首先定義TUploadFile的幾個私有變量
在單元文件UP01.PAS(由Unit1.PAS另存)中加入對ASPTypeLibrary_TLB.PAS的引用(Uses),
然后加入
private
FContentLength : LongInt;//請求信息內容長度
FContentData : Variant;//內容數據,以數組形式存儲請求信息內容
FFileName, //要上載的文件名稱
FDelimeter : string; //表單域分界符
FScriptingContext : IScriptingContext;//ASP處理上下文環境內容
FFileDataStart, //文件數據開始位置
FFileDataEnd : LongInt; //文件數據結束位置

  2、提取客戶端上傳的請求信息數據
//在OnStartPage事件中,獲取ASP上下文信息、請求信息內容、表單域的分界符、文件數據
procedure TUploadFile.OnStartPage(AScriptingContext: IUnknown);
var
ARequest : IRequest; //WWW請求對象
AOleVariant : OleVariant; //記錄請求信息內容長度
intDelimterLength : integer;//分界符長度
longIndex,ALongInt,longPos : LongInt;
ContentData : AnsiString;//請求信息內容的字符串表示
strTemp : string;
FindEndOfFileData : boolean;//是否找到文件數據結束位置
begin
//提取客戶端上傳的請求信息數據
FScriptingContext := AScriptingContext as IScriptingContext;//獲取ASP上下文信息
ARequest := FScriptingContext.Request;//獲取WWW請求信息
FContentLength := ARequest.TotalBytes;//請求信息內容長度
//創建動態數組,用于以數組形式存儲請求信息內容
FContentData := VarArrayCreate( [0,FContentLength], varByte );
//將請求信息內容存儲到數組中
AOleVariant := FContentLength;
FContentData := ARequest.BinaryRead( AOleVariant );//讀取請求信息內容
//將請求信息內容轉化為字符串,便于定位
ContentData := '';
for longIndex := 0 to FContentLength - 1 do
begin
ContentData := ContentData + chr( Byte( FContentData[ longIndex ] ));
if FContentData[ longIndex ] = 0 then break;//0表示內容結束
end;

  3、獲取分界符、上載文件名稱
//獲取表單域的分界符
longPos := pos( #13#10,ContentData );//回車換行符所在位置
FDelimeter := Copy( ContentData,1,longPos-1);//該位置之前的內容為分隔符

//獲取帶源路徑的文件名稱,在請求信息內容中,文件名稱以
//filename="path/filename"的形式存儲
strTemp := 'filename="';//文件名稱在“filename="”之后
longPos := pos( strTemp, ContentData );//獲取“filename="”位置
if longPos <= 0 then
begin
FFileName := '';
FFileDataStart := -1;
FFileDataEnd := -2;
exit;
end;
//獲取下個雙引號“"”之前的內容,即帶源路徑的文件名稱
longPos := longPos + length( strTemp );
strTemp := '';
for longIndex := longPos to FContentLength - 1 do
if ContentData[ longIndex ] <> '"' then
strTemp := strTemp + ContentData[ longIndex ]
else break;
FFileName := strTemp;

  4、獲取文件數據的在請求信息內容中的開始、結束位置
//文件數據開始位置在文件名稱后的第一個#13#10#13#10之后
delete( ContentData, 1, longIndex );
strTemp := #13#10#13#10;
FFileDataStart := longIndex + pos(strTemp, ContentData) + length(strTemp) - 1;

//文件數據結束位置在下一個#13#10和分界符之前
//由于文件數據可能包含非法字符,不能再用字符串定位函數POS
//查找下一個分界符的位置
FFileDataEnd := FFileDataStart;
intDelimterLength := length( FDelimeter );
FindEndOfFileData := false;
while FFileDataEnd <= FContentLength - intDelimterLength do
begin
FindEndOfFileData := true;
for ALongInt := 0 to intDelimterLength - 1 do
if Byte( FDelimeter[ ALongInt + 1 ] ) <> 
FContentData[ FFileDataEnd + ALongInt ] then
begin
FindEndOfFileData := false;
break;
end;
if FindEndOfFileData then break;
FFileDataEnd := FFileDataEnd + 1;
end;
if not FindEndOfFileData then FFileDataEnd := FFileDataStart - 1//未找到分界符
else FFileDataEnd := FFileDataEnd - 3;//分界符,向前跳過#13#10
end;

  (三)向ASP程序傳遞信息
  在進行了(二)的操作之后,我們的上載組件可以根據ASP程序的要求向其傳遞數據了。目前
可以提供的數據有:客戶端源文件名稱(FFileName,含路徑)、文件大小(FFileDataEnd-FFileDataStart+1)。
首先應該在TLB設計窗口中聲明如下兩個方法GetFileName和GetFileSize。
  1、返回客戶端源文件名稱(含路徑)
//返回客戶端源文件名稱(含路徑)
function TUploadFile.GetFileName: OleVariant;
begin
result := FFileName;//客戶端源文件名稱(含路徑)
end;
  2、返回文件大小
//返回文件大小(Bytes)
function TUploadFile.GetFileSize: OleVariant;
begin
result := FFileDataEnd - FFileDataStart + 1;
end;

  (四)保存文件
  在進行了(二)的操作之后,我們的上載組件可以根據ASP程序的要求保存文件了。首先應該在
TLB設計窗口中聲明如下兩個方法SaveFileAs和SaveFile。
  1、按指定文件名稱保存文件
//按指定的文件名稱保存文件,參數FileName為指定的文件名稱,返回值True表示文件保存成功
function TUploadFile.SaveFileAs(FileName: OleVariant): OleVariant;
var
longIndex : LongInt;
AFile : file of byte;//以二進制的形式保存文件
byteData : Byte;
begin
result := true;
try
assign( AFile, FileName );
rewrite( AFile );
for longIndex := FFileDataStart to FFileDataEnd do
begin
byteData := Byte( FContentData[ longIndex ] );
Write( AFile, byteData );
end;
CloseFile( AFile );
except
result := false;
end;
end;
  2、按缺省文件名稱保存文件
//按缺省文件名稱保存文件,將文件以同名文件保存在調用頁面所在目錄
function TUploadFile.SaveFile: OleVariant;
var
CurrentFilePath : string;
begin
//獲取調用頁面所在目錄
CurrentFilePath := FScriptingContext.Request.ServerVariables['PATH_TRANSLATED'];
CurrentFilePath := ExtractFilePath( CurrentFilePath );
//保存文件
result := SaveFileAs( CurrentFilePath + ExtractFileName( FFileName ));
end;

三、上載組件應用舉例
  在我們的例子中,DelphiUp.HTM是文件上載界面,DelphiUp.ASP用來執行文件上載操作。
DelphiUp.ASP的代碼如下:





四、幾點說明
  1、由DELPHI自動生成的源代碼編譯的DLL文件大小有215K,可以在
ASPTypeLibrary_TLB.PAS的Interface段中將Uses中的單元除ActiveX外全部刪除,在
MyUpload_TLB.PAS中刪除Uses中所有單元,則生成的DLL文件大小可減少到61K。
  2、以上方法同樣適用于CGI程序,不過要用TWebRequest對象。

以上程序在PWIN98+Delphi3.0+PWS4.0下調試通過。
(作者:王發軍 wangfajun@163.net http://wangfajun.163.net) 
Welcome to www.net990.net ,2000,7,24

 
 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区三区av| 欧美videofree性高清杂交| ...av二区三区久久精品| 国产日韩欧美精品在线| 国产一区二区三区免费在线观看| 在线观看亚洲一区| 粉嫩av一区二区三区粉嫩| 视频一区中文字幕| 国内欧美视频一区二区| 色哦色哦哦色天天综合| 狠狠色丁香婷婷综合| 亚洲va韩国va欧美va| 欧美亚洲图片小说| 91一区二区三区在线播放| 日韩av中文字幕一区二区| 一区二区免费在线播放| 国产精品久久久久久久久免费丝袜| 91亚洲国产成人精品一区二区三 | 欧美天天综合网| 99re成人精品视频| 91丨九色porny丨蝌蚪| 国产精品18久久久久久久久久久久| 日韩1区2区3区| 日本亚洲三级在线| 蜜臀国产一区二区三区在线播放| 国产精品免费看片| 亚洲欧美成人一区二区三区| 国产精品久久久久久久久免费丝袜 | 五月婷婷综合网| 婷婷久久综合九色国产成人| 视频一区在线视频| 日本伊人色综合网| 美腿丝袜亚洲综合| 亚洲国产另类精品专区| 免费在线观看一区| 国产精品91一区二区| 成人自拍视频在线| 色吧成人激情小说| 欧美片在线播放| 日韩精品一区二区三区三区免费| 久久久亚洲欧洲日产国码αv| 国产日产欧美一区| ...中文天堂在线一区| 亚洲视频在线一区观看| 亚洲图片一区二区| 久久精品理论片| 成人深夜福利app| 欧美日韩成人综合| 久久久久国色av免费看影院| 亚洲视频在线观看三级| 天天综合网 天天综合色| 日韩高清一区在线| 99久久精品免费精品国产| 欧美日韩一区 二区 三区 久久精品| 日韩三级视频在线观看| 国产一区二区三区在线观看免费 | 亚洲尤物视频在线| 精品一区二区综合| 91免费看`日韩一区二区| 9191国产精品| 中文字幕一区二区三区不卡| 亚洲少妇中出一区| 国产老肥熟一区二区三区| 色先锋久久av资源部| 欧美一卡二卡在线观看| 亚洲丝袜美腿综合| 国产一区二区不卡在线| 精品视频一区三区九区| 亚洲国产精品精华液2区45| 视频在线观看91| 国产电影一区二区三区| 91精品国产综合久久精品麻豆 | 欧美群妇大交群中文字幕| 国产亚洲欧美日韩在线一区| 亚洲国产人成综合网站| 亚洲色图欧洲色图婷婷| 欧美女孩性生活视频| 日韩一区二区视频| 综合色天天鬼久久鬼色| 国产一区免费电影| 欧美一区二区私人影院日本| 国产精品色在线| 韩国av一区二区三区| 欧美一区二区久久久| 亚洲一卡二卡三卡四卡无卡久久| 成人久久视频在线观看| 国产色一区二区| 国产在线精品一区二区不卡了| 色婷婷av一区二区三区之一色屋| 亚洲国产精品国自产拍av| 狠狠色丁香九九婷婷综合五月| 欧美人动与zoxxxx乱| 午夜欧美电影在线观看| 欧美日韩成人综合天天影院| 一区二区三区日韩欧美| 成人一道本在线| 精品女同一区二区| 美国三级日本三级久久99| 欧美日韩一区不卡| 天堂午夜影视日韩欧美一区二区| 欧美日韩五月天| 强制捆绑调教一区二区| 欧美喷水一区二区| 最好看的中文字幕久久| 成人动漫视频在线| 国产精品乱人伦中文| 99久久精品99国产精品| 亚洲精品水蜜桃| 欧美在线一二三四区| 亚洲国产sm捆绑调教视频| 欧美亚日韩国产aⅴ精品中极品| 亚洲一区二区在线视频| 欧美日韩国产首页| 蜜桃一区二区三区在线| 久久精品夜色噜噜亚洲a∨| 国产成人精品亚洲午夜麻豆| 国产精品每日更新| 一道本成人在线| 天堂在线一区二区| 久久精品夜夜夜夜久久| 一本到高清视频免费精品| 亚洲丶国产丶欧美一区二区三区| 欧美一区二区福利视频| 久久99国产精品成人| 国产精品天干天干在观线| 日本精品视频一区二区| 天堂在线亚洲视频| 国产欧美日韩激情| 欧美三级三级三级| 激情综合网天天干| 亚洲青青青在线视频| 日韩欧美美女一区二区三区| www.久久久久久久久| 午夜欧美视频在线观看| 欧美激情自拍偷拍| 午夜一区二区三区视频| 久久精品人人爽人人爽| 欧美电影免费观看高清完整版在线| 91国产精品成人| 91在线观看一区二区| 国产精品综合一区二区三区| 麻豆91在线播放免费| 亚洲午夜在线视频| 亚洲一区二区三区国产| 一区二区三区精品视频| 一区二区三区欧美日| 亚洲日本va在线观看| 国产精品国产三级国产aⅴ原创 | k8久久久一区二区三区| 国产精品99久久久久久有的能看| 国模无码大尺度一区二区三区| 美脚の诱脚舐め脚责91| 久久综合综合久久综合| 老司机午夜精品99久久| 精品无码三级在线观看视频| 久久精品噜噜噜成人av农村| 激情文学综合插| 国产精品香蕉一区二区三区| 国产福利一区二区三区视频在线 | 欧美性大战久久久久久久蜜臀 | 99re亚洲国产精品| 色综合天天综合色综合av| 欧美久久一区二区| 91麻豆swag| 欧美性videosxxxxx| 欧美精品色一区二区三区| 欧美不卡一区二区三区四区| 久久亚洲免费视频| 日本一区二区成人在线| 亚洲男帅同性gay1069| 五月婷婷综合网| 激情欧美日韩一区二区| 91亚洲午夜精品久久久久久| 欧美理论在线播放| 精品国产三级a在线观看| 中文字幕在线观看一区| 日韩电影在线观看电影| 岛国av在线一区| 欧美日本一区二区三区四区| 久久无码av三级| 亚洲一区免费观看| 韩国精品久久久| 欧亚一区二区三区| 精品美女在线播放| 一区二区三区在线免费视频| 麻豆国产欧美一区二区三区| 99国产精品久久| 欧美r级在线观看| 亚洲精品欧美在线| 国产一区 二区 三区一级| 色综合久久综合网| 久久久久久免费毛片精品| 亚洲一区二区三区四区在线观看 | 不卡一区二区中文字幕| 欧美日韩午夜在线视频| 国产精品乱码妇女bbbb| 蜜桃精品视频在线观看| 在线视频你懂得一区| 日本一区二区综合亚洲| 日本欧美一区二区三区|