用DELPHI為ASP開發檔案上載元件 (轉)
用DELPHI為ASP開發檔案上載元件 (轉)[@more@]
ASP(Active Server Page)是公司的產品,由於它很容易上手,能開發功能強大的動態網站,現在很多網站(特別是Intr/Extranet內部網)採用了NT+IIS+ASP的,使得ASP成為目前較為流行的網站開發指令碼語言。在WEB服務中,檔案上載服務是一個很常見的功能,而WIN9X下的PWS沒有提供相關元件;NT下的IIS提供了一個Post Acceptor元件,但由於它要檢查的WWW訪問而變得不太好用;也可以從Internet上有關元件,但這些大多都是商業元件,用於下載的是試用版,在使用時間或功能上都有限制。由於ASP可以標準的OLE/COM元件,我們可以用VB/VC/DELPHI等高階程式設計工具根據我們自己的要求來定製自己的ASP檔案上載元件,滿足自己的應用要求。
下面將討論用DELPHI為ASP開發檔案上載元件的原理和具體實現過程。
一、檔案上載的實現原理
基於方式資料,要遵從1867標準,上載的檔案資料也不例外。如用下面HTML頁面檔案(delphiup.htm)選擇上載檔案:
<!-- DelphiUp.htm:檔案上載介面 -->
檔案上載
用DELPHI編寫的檔案上載元件實現檔案上載
當客戶端選擇了一個檔案(如Test.TXT,其內容為“這裡是一個用於上載的檔案的內容。”)並按
“確認上載”按鈕提交資料後,端收到的資料將具有如下形式:
-----------------------------7cf1d6c4713#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、建立 Library工程
在DELPHI中選擇選單File=》New...,在“New Item”對話方塊的ActiveX選項卡中選擇“ActiveX Library”,DELPHI會自動建立一個DLL工程Project1。
2、建立Automation元件
在DELPHI中選擇選單File=》New...,在“New Item”對話方塊的ActiveX選項卡中選擇“Automation ”;然後在“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”列表選擇“ 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,longP: 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的程式碼如下:
<!--DelphiUp.ASP:檔案上載處理頁面-->
檔案上載
set Upload = Server.CreateObject("MyUpload.UploadFile")
FileName = Upload.GetFileName
Response.Write "
正在儲存檔案《"&FileName&"》......"
if Upload.SaveFile then
Response.Write "
檔案《"&FileName&"》上載成功。"
Response.Write "
檔案大小為"&Upload.GetFileSize&"位元組。"
else
Response.Write "
檔案《"&FileName&"》上載失敗。"
end if
set Upload=nothing %>
四、幾點說明
1、由DELPHI自動生成的編譯的DLL檔案大小有215K,可以在
ASPTypeLibrary_TLB.PAS的Interface段中將Uses中的單元除ActiveX外全部刪除,在
MyUpload_TLB.PAS中刪除Uses中所有單元,則生成的DLL檔案大小可減少到61K。
2、以上方法同樣適用於CGI程式,不過要用TWebRequest物件。
以上程式在P+Delphi3.0+PWS4.0下透過。
用為開發上載 深圳王發軍 返回
ASP(Active Server Page)是公司的產品,由於它很容易上手,能開發功能強大的動態網站,現在很多網站(特別是Intr/Extranet內部網)採用了NT+IIS+ASP的,使得ASP成為目前較為流行的網站開發指令碼語言。在WEB服務中,檔案上載服務是一個很常見的功能,而WIN9X下的PWS沒有提供相關元件;NT下的IIS提供了一個Post Acceptor元件,但由於它要檢查的WWW訪問而變得不太好用;也可以從Internet上有關元件,但這些大多都是商業元件,用於下載的是試用版,在使用時間或功能上都有限制。由於ASP可以標準的OLE/COM元件,我們可以用VB/VC/DELPHI等高階程式設計工具根據我們自己的要求來定製自己的ASP檔案上載元件,滿足自己的應用要求。
下面將討論用DELPHI為ASP開發檔案上載元件的原理和具體實現過程。
一、檔案上載的實現原理
基於方式資料,要遵從1867標準,上載的檔案資料也不例外。如用下面HTML頁面檔案(delphiup.htm)選擇上載檔案:
<!-- DelphiUp.htm:檔案上載介面 -->
用DELPHI編寫的檔案上載元件實現檔案上載
檔案另存為:
請要選擇上載的檔案:
當客戶端選擇了一個檔案(如Test.TXT,其內容為“這裡是一個用於上載的檔案的內容。”)並按
“確認上載”按鈕提交資料後,端收到的資料將具有如下形式:
-----------------------------7cf1d6c4713#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、建立 Library工程
在DELPHI中選擇選單File=》New...,在“New Item”對話方塊的ActiveX選項卡中選擇“ActiveX Library”,DELPHI會自動建立一個DLL工程Project1。
2、建立Automation元件
在DELPHI中選擇選單File=》New...,在“New Item”對話方塊的ActiveX選項卡中選擇“Automation ”;然後在“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”列表選擇“ 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,longP: 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的程式碼如下:
<!--DelphiUp.ASP:檔案上載處理頁面-->
set Upload = Server.CreateObject("MyUpload.UploadFile")
FileName = Upload.GetFileName
Response.Write "
正在儲存檔案《"&FileName&"》......"
if Upload.SaveFile then
Response.Write "
檔案《"&FileName&"》上載成功。"
Response.Write "
檔案大小為"&Upload.GetFileSize&"位元組。"
else
Response.Write "
檔案《"&FileName&"》上載失敗。"
end if
set Upload=nothing %>
四、幾點說明
1、由DELPHI自動生成的編譯的DLL檔案大小有215K,可以在
ASPTypeLibrary_TLB.PAS的Interface段中將Uses中的單元除ActiveX外全部刪除,在
MyUpload_TLB.PAS中刪除Uses中所有單元,則生成的DLL檔案大小可減少到61K。
2、以上方法同樣適用於CGI程式,不過要用TWebRequest物件。
以上程式在P+Delphi3.0+PWS4.0下透過。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-995473/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用Delphi 6開發ASP上傳元件詳解 (轉)元件
- 【巴山】Asp.NET大檔案上傳元件開發總結(二)---提取檔案內容ASP.NET元件
- 用DELPHI開發DirectX遊戲 (轉)遊戲
- 編譯 asp 應用程式成為 exe 檔案 (轉)編譯
- 用ASP、NET開發下載系統(三) (轉)
- 用ASP.NET上傳大檔案ASP.NET
- 用ASP開啟遠端MDB檔案的方法 (轉)
- PHP開發之檔案的上傳下載PHP
- delphi讀取ini檔案 (轉)
- 【巴山】Asp.NET大檔案上傳元件開發總結(四)---封送資料給Asp.NET頁面ASP.NET元件
- 檔案上傳用XML (轉)XML
- ASP.NET中檔案上傳下載方法集合ASP.NET
- 利用ASP開發Web應用 (轉)Web
- Angular元件-檔案上傳元件Angular元件
- ASP.NET檔案下載的實用方法ASP.NET
- 用Delphi編寫點對點傳檔案程式(1) (轉)
- 用Delphi編寫點對點傳檔案程式(2) (轉)
- 用Java編寫ASP元件 (轉)Java元件
- Bootstrap檔案上傳元件應用:bootstrap fileinputboot元件
- asp.net 檔案上傳和下載管理原始碼ASP.NET原始碼
- Android開發之SD卡上檔案操作 (轉)AndroidSD卡
- 微信開發 檔案上傳
- 獲取檔案路徑(Delphi )----轉貼
- Delphi編碼標準——檔案命名 (轉)
- ASP.NET 檔案下載ASP.NET
- ASP.NET中下載檔案ASP.NET
- JavaWeb之實現檔案上傳與下載元件JavaWeb元件
- 基於React的大檔案上傳元件的開發詳解React元件
- 用Delphi進行word開發
- Delphi 開發ActiveX控制元件(非ActiveForm)控制元件ORM
- ASP中多檔案同時上傳解決方案 (轉)
- 在ASP.NET中實現多檔案上傳 (轉)ASP.NET
- ASP.NET Core 檔案上傳ASP.NET
- iOS開發-NSURLSession檔案上傳iOSSession
- 用Delphi 開發資料庫程式經驗三則 (轉)資料庫
- DLL檔案在Delphi的建立及呼叫 (轉)
- 巧用ASP生成PDF檔案 (轉)
- 一鍵清除Delphi中無用的檔案