文件上傳是WEB開發中經常要用到的功能
源碼和demo我已經發布在個人主頁上http://www
一
首先我們來看一個html文件源碼
<html>
<body>
<center>
<form name=
action=
<input type=file name=mefile><br>
<input type=hidden name=a
<input type=hidden name=a
<input type=hidden name=a
<input type=hidden name=a
<input type=hidden name=a
<input type=text name=a
<input type=submit name=ok value=
</form>
</center>
</body>
</html>
這個文件裡包含了一個名為mainForm的form
這種編碼會產生什麼樣的表單信息呢?讓我們來看看test
<%
formsize=request
formdata=request
response
%>
如讀者在注釋中了解的
name=
Pictures\zzjh
name=
form
Content
name=
Content
name=
form
這就是用
分析一下這段信息的格式
Content
name=
filename=
傳文件在本地硬盤上的名稱
Content
後面是文件本身的數據
其它各個域的信息也可以以此類推
眾所周知
問題的症結已經找到
二
Delphi
啟動Delphi
在myobj下的名為Iupfile的Interface下
Iupfile = interface(IDispatch)
[
procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
procedure OnEndPage; safecall;
function Get_Form(Formname: OleVariant): OleVariant; safecall;
function Get_FileName: OleVariant; safecall;
function Get_FileSize: Integer; safecall;
procedure FileSaveAs(FileName: OleVariant); safecall;
function Get_FileData: OleVariant; safecall;
function Get_FileType: OleVariant; safecall;
property Form[Formname: OleVariant]: OleVariant read Get_Form;
property FileName: OleVariant read Get_FileName;
property FileSize: Integer read Get_FileSize;
property FileData: OleVariant read Get_FileData;
property FileType: OleVariant read Get_FileType;
end;
其中的OnStartPage方法和OnEndPage方法是Delphi默認生成的
切換到unit
除了完成Iupfile接口中的屬性和方法之後
Tupfile = class(TASPObject
public
protected
procedure OnEndPage; safecall; //頁面開始
procedure OnStartPage(const AScriptingContext: IUnknown); safecall; //頁面
結束
procedure FileSaveAs(Filename: OleVariant); safecall; //保存文件
function Get_Form(Formname: OleVariant): OleVariant; safecall; //
function Get_FileName: OleVariant; safecall;
function Get_FileSize: Integer; safecall;
function Get_FileData: OleVariant; safecall;
function Get_FileType: OleVariant; safecall;
private
FContentData:string;
FFileData
FFormInfo:TStringList;
function instr(str
procedure AnalyFormData(content:string);
end;
下面我們來一一分析這些成員的具體實現
procedure Tupfile
var
AOleVariant : OleVariant;
tmpvar : OleVariant;
contentlength : integer;
i
FDelimeter : string;
begin
inherited OnStartPage(AScriptingContext);
FFormInfo := TStringList
contentlength := Request
AOleVariant := contentlength;
tmpvar := Request
for i :=
begin
FContentData := FContentData + chr(byte(tmpvar[i]));
end;
pos
FDelimeter := copy(FContentData
DeliCount := length(FDelimeter);
lastpos :=
pos
while pos
begin
pos
if pos
pos
pos
AnalyFormData(copy(FContentData
lastpos := pos
end;
end;
前面說過
由於Delphi已經對ASP中的對象進行了很好的封裝
接下來
再看AnalyFormData函數的實現
procedure Tupfile
var
pos
FormName
isFile:boolean;
begin
isFile := false;
pos
pos
FormName := copy(content
//檢查是否文件
pos
if pos
begin
isFile := true;
pos
pos
FFilename := copy(content
end;
pos
FormValue := copy(content
if isfile then
begin
FFileData := FormValue;
//查找文件類型信息
pos
if pos
begin
pos
FFileType := copy(content
end;
end
else
begin
FFormInfo
end;
end;
如注釋中所表達的
function Tupfile
begin
Result := FFormInfo
end;
這個函數返回域的值
function Tupfile
begin
Result := ExtractFileName(FFileName);
end;
function Tupfile
begin
Result := length(FFileData);
end;
function Tupfile
var
i:integer;
begin
Result := VarArrayCreate( [
for i :=
begin
Result[i] := Byte(FFileData[i+
end;
end;
這三個函數分別返回文件的名稱
procedure Tupfile
var
fsout:TFileStream;
i:integer;
afile:file of byte;
begin
fsout := TFileStream
for i :=
begin
fsout
end;
fsout
end;
這個方法將文件保存到服務器上的磁盤
編譯myobj這個project
三
在命令行下
將本文開頭提到的test
<%
Set upfile = Server
response
response
response
response
response
response
response
response
upfile
set upfile = nothing
%>
再次訪問test
這個組件只能上傳單個文件
From:http://tw.wingwit.com/Article/program/Delphi/201311/24952.html