翻譯|使用教程|編輯:況魚杰|2019-07-18 17:03:41.623|閱讀 578 次
概述:本教程將會介紹如何從位于Server運行目錄中的文件夾中發(fā)送小文件,通過這種方法,就可以控制從服務(wù)器訪問文件的類型。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
RealThinClient SDK是用于開發(fā)標(biāo)準(zhǔn)的HTTP(S)服務(wù)器,ISAPI擴展以及客戶端的VCL控件。可用于Windows下的CodeGear Delphi 6-2010。關(guān)于RealThinClient SDK的教程會持續(xù)更新,本節(jié)是RealThinClient SDK的第四課,如何從服務(wù)器發(fā)送小文件。
本教程將會介紹如何從位于Server運行目錄中的文件夾中發(fā)送小文件,通過這種方法,就可以控制從服務(wù)器訪問文件的類型,我們將使用一些函數(shù)來保護我們的服務(wù)器并檢查內(nèi)容(在這種情況下的文件大小)是否足夠小以便發(fā)送。在下一課中,我們將會了解如何處理更大一些的文件。
接下來看看具體的操作步驟(文章中會使用到第三課的代碼,點擊獲取):
從第三課加載項目。
將RtcDataProvider組件添加到項目中。
我們必須在Form1中添加一個新的RtcDataProvider組件,以便獲得任何不是我們之前在項目中放入的rdpTime或rdpSquare組件的請求。
為我們的RtcDataProvider組件設(shè)置服務(wù)器屬性。
與我們之前的組件一樣,我們必須告訴我們的新組件服務(wù)器組件將使用哪個來檢查請求。
為RtcDataProvider組件設(shè)置CheckOrder屬性。
我們必須為rdpFiles組件設(shè)置CheckOrder屬性,以使其成為來自RtcHttpServer1組件的Request(OnCheckRequest事件)的最后一個屬性。如果我們查看以前的組件,它們的CheckOrder屬性中的值都為0(零),為了確保我們的新RtcDataProvider組件是檢查請求的最后一個組件,我們將它的CheckOrder設(shè)置為900。CheckOrder屬性是訂單,其中將要求組件處理請求,與連接到同一服務(wù)器的其他組件相比,此訂單號越小,組件將被要求處理請求越快。
添加一個功能以檢查文件位置。
我們將創(chuàng)建一個函數(shù)來檢查文件位置以及文件是否存在。
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;
我們在做什么?
為我們的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;
我們在做什么?
請記住,在步驟4中,我們將RtcDataProvider組件的CheckOrder屬性設(shè)置為900,那么,現(xiàn)在發(fā)生的是其他兩個RtcDataProvider組件將其CheckOrder屬性設(shè)置為0,因此這兩個組件將首先檢查Request,在檢查Request之后,我們的rdpFiles組件將檢查Request并發(fā)送任何除/ TIME和/ SQUARE的文件。
為我們的RtcDataProvider組件配置OnDataReceived事件。
一旦我們的RtcDataProvider組件接受了Request,我們就會看看是否會發(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;
我們在做什么?
創(chuàng)建目錄并添加幾個文件。
我們必須創(chuàng)建一個目錄來保存我們將為請求發(fā)送的文件,該目錄必須稱為/ data(參見步驟5)。
接下來,我們可以在要提供的“/ data”目錄中復(fù)制或創(chuàng)建一些文件。出于這個例子的目的,我在這個目錄中放了兩個文件,一個TXT和一個EXE文件。EXE文件大于2048字節(jié),因此我們可以看到文件大小錯誤。
編譯并運行項目。
當(dāng)沒有要提供的文件時:
文件太大時:
正常時:
關(guān)注慧聚IT微信公眾號 ???,了解產(chǎn)品的最新動態(tài)及最新資訊。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: