翻譯|使用教程|編輯:況魚(yú)杰|2019-07-18 17:03:41.623|閱讀 578 次
概述:本教程將會(huì)介紹如何從位于Server運(yùn)行目錄中的文件夾中發(fā)送小文件,通過(guò)這種方法,就可以控制從服務(wù)器訪(fǎng)問(wèn)文件的類(lèi)型。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
相關(guān)鏈接:
RealThinClient SDK是用于開(kāi)發(fā)標(biāo)準(zhǔn)的HTTP(S)服務(wù)器,ISAPI擴(kuò)展以及客戶(hù)端的VCL控件。可用于Windows下的CodeGear Delphi 6-2010。關(guān)于RealThinClient SDK的教程會(huì)持續(xù)更新,本節(jié)是RealThinClient SDK的第四課,如何從服務(wù)器發(fā)送小文件。
點(diǎn)擊下載最新版RealThinClient SDK
本教程將會(huì)介紹如何從位于Server運(yùn)行目錄中的文件夾中發(fā)送小文件,通過(guò)這種方法,就可以控制從服務(wù)器訪(fǎng)問(wèn)文件的類(lèi)型,我們將使用一些函數(shù)來(lái)保護(hù)我們的服務(wù)器并檢查內(nèi)容(在這種情況下的文件大小)是否足夠小以便發(fā)送。在下一課中,我們將會(huì)了解如何處理更大一些的文件。
接下來(lái)看看具體的操作步驟(文章中會(huì)使用到第三課的代碼,點(diǎn)擊獲取):
從第三課加載項(xiàng)目。

將RtcDataProvider組件添加到項(xiàng)目中。
我們必須在Form1中添加一個(gè)新的RtcDataProvider組件,以便獲得任何不是我們之前在項(xiàng)目中放入的rdpTime或rdpSquare組件的請(qǐng)求。


為我們的RtcDataProvider組件設(shè)置服務(wù)器屬性。
與我們之前的組件一樣,我們必須告訴我們的新組件服務(wù)器組件將使用哪個(gè)來(lái)檢查請(qǐng)求。

為RtcDataProvider組件設(shè)置CheckOrder屬性。
我們必須為rdpFiles組件設(shè)置CheckOrder屬性,以使其成為來(lái)自RtcHttpServer1組件的Request(OnCheckRequest事件)的最后一個(gè)屬性。如果我們查看以前的組件,它們的CheckOrder屬性中的值都為0(零),為了確保我們的新RtcDataProvider組件是檢查請(qǐng)求的最后一個(gè)組件,我們將它的CheckOrder設(shè)置為900。CheckOrder屬性是訂單,其中將要求組件處理請(qǐng)求,與連接到同一服務(wù)器的其他組件相比,此訂單號(hào)越小,組件將被要求處理請(qǐng)求越快。

添加一個(gè)功能以檢查文件位置。
我們將創(chuàng)建一個(gè)函數(shù)來(lái)檢查文件位置以及文件是否存在。
function TForm1.GetFullFileName(psFileName: string): string;
var
vsDocRoot : string; //(1)
begin
vsDocRoot := ExtractFilePath(ParamStr(0)); //(2)
if Copy(vsDocRoot, Length(vsDocRoot), 1) = '\' then
Delete(vsDocRoot, Length(vsDocRoot), 1); //(3)
vsDocRoot := vsDocRoot + '\data'; //(4)
psFileName := StringReplace(psFileName, '/', '\', [rfreplaceall]); //(5)
psFileName := StringReplace(psFileName, '%20', ' ', [rfreplaceall]);
Result := ExpandFileName(Trim(vsDocRoot) + Trim(psFileName)); //(6)
if (AnsiPos('\..', Result) > 0) or //(7)
(UpperCase(Copy(Result, 1, Length(vsDocRoot))) <> UpperCase(vsDocRoot)) then
Result := '';
end;我們?cè)谧鍪裁矗?/strong>
為我們的RtcDataProvider組件配置OnCheckRequest事件。
procedure TForm1.rdpFilesCheckRequest(Sender: TRtcConnection); var vsFileName : string; //(1) begin with TRtcDataServer(Sender) do //(2) begin vsFileName := GetFullFileName(Request.FileName); //(3) Accept; Request.Info['FName'] := vsFileName; //(4) end; end;
我們?cè)谧鍪裁矗?/strong>
請(qǐng)記住,在步驟4中,我們將RtcDataProvider組件的CheckOrder屬性設(shè)置為900,那么,現(xiàn)在發(fā)生的是其他兩個(gè)RtcDataProvider組件將其CheckOrder屬性設(shè)置為0,因此這兩個(gè)組件將首先檢查Request,在檢查Request之后,我們的rdpFiles組件將檢查Request并發(fā)送任何除/ TIME和/ SQUARE的文件。
為我們的RtcDataProvider組件配置OnDataReceived事件。
一旦我們的RtcDataProvider組件接受了Request,我們就會(huì)看看是否會(huì)發(fā)回消息文件。
procedure TForm1.rdpFilesDataReceived(Sender: TRtcConnection);
var
vsFileName : string; //(1)
viFileSize : integer;
begin
with TRtcDataServer(Sender) do //(2)
if Request.Complete then
begin
vsFileName := Request.Info['FName']; //(3)
if File_Exists(vsFileName) then //(4)
begin
viFileSize := File_Size(vsFileName); //(5)
if (viFileSize <= 2048) then
Write(Read_File(vsFileName)) //(6)
else
Write('File Too Long to be served: ' + IntToStr(viFileSize) + ' bytes'); //(7)
end
else
Write('File not found on server: ' + Request.Info['FName']); //(8)
end;
end;我們?cè)谧鍪裁矗?/strong>
創(chuàng)建目錄并添加幾個(gè)文件。
我們必須創(chuàng)建一個(gè)目錄來(lái)保存我們將為請(qǐng)求發(fā)送的文件,該目錄必須稱(chēng)為/ data(參見(jiàn)步驟5)。

接下來(lái),我們可以在要提供的“/ data”目錄中復(fù)制或創(chuàng)建一些文件。出于這個(gè)例子的目的,我在這個(gè)目錄中放了兩個(gè)文件,一個(gè)TXT和一個(gè)EXE文件。EXE文件大于2048字節(jié),因此我們可以看到文件大小錯(cuò)誤。

編譯并運(yùn)行項(xiàng)目。
當(dāng)沒(méi)有要提供的文件時(shí):

文件太大時(shí):

正常時(shí):

關(guān)注慧聚IT微信公眾號(hào) ???,了解產(chǎn)品的最新動(dòng)態(tài)及最新資訊。

本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: