lazarus/components/fpweb/demo/fptemplate/fileupload/apache/webmodule.pas
vincents e2d0fec11d fpweb: patch from Attila Borka (issue #13901)
* added note about minimal fpc version
* minor message changes

git-svn-id: trunk@20396 -
2009-06-04 08:29:52 +00:00

211 lines
5.5 KiB
ObjectPascal

unit webmodule;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, HTTPDefs, websession, fpHTTP, fpWeb;
type
{ TFPWebModule1 }
TFPWebModule1 = class(TFPWebModule)
procedure DataModuleAfterResponse(Sender: TObject; AResponse: TResponse);
procedure DataModuleCreate(Sender: TObject);
procedure listfilesRequest(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
private
{ private declarations }
UploadDir:String;
FileDB:String;
MaxSize:Integer;
procedure DeleteTheFile(const FN:String);
procedure HandleUploadedFiles;
procedure listfilesReplaceTag(Sender: TObject; const TagString:String;
TagParams: TStringList; Out ReplaceText: String);
public
{ public declarations }
end;
var
FPWebModule1: TFPWebModule1;
implementation
{ TFPWebModule1 }
procedure TFPWebModule1.DataModuleAfterResponse(Sender: TObject;
AResponse: TResponse);
begin
//reset global variables for apache modules for the next incoming request
//
end;
procedure TFPWebModule1.DataModuleCreate(Sender: TObject);
begin
UploadDir := 'upfiles/';
FileDB := 'filelist.txt';
MaxSize := 2;//MB
end;
procedure TFPWebModule1.DeleteTheFile(const FN:String);
var
FDB: TStringList;
s:String;
begin
FDB := TStringList.Create;
if FileExists(FileDB) then
FDB.LoadFromFile(FileDB);
s := FDB.Values[FN];
if s <> '' then
begin
FDB.Delete(FDB.IndexOfName(FN));
FDB.SaveToFile(FileDB);
FDB.Free;
end else begin
FDB.Free;
Request.QueryFields.Add('_MSG=NOTFOUND');//NOTFOUND message will be displayed on the response page
Exit;
end;
//delete the file
s := UploadDir + FN;
if FileExists(s) then
DeleteFile(s);
end;
procedure TFPWebModule1.HandleUploadedFiles;
var
i,j:Integer;
all_ok:Boolean;
FDB: TStringList;
Uploader, FN:String;
begin
if Request.Files.Count <= 0 then Exit;
//process the uploaded files if there was any
all_ok := true;
for i := 0 to Request.Files.Count - 1 do
begin//check sizes
if Request.Files[i].Size > (MaxSize * 1024 * 1024) then
begin//exceeds size limit
all_ok := false;
Request.QueryFields.Add('_MSG=TOOBIG');//TOOBIG message will be displayed on the response page
break;
end;
end;
if all_ok then //copy the file(s) to the upload directory (the temporary files will be deleted automatically after the request is handled)
begin
Uploader := Request.ContentFields.Values['UPLOADERPERSON'];
if Uploader = '' then
Uploader := '-';
FDB := TStringList.Create;
if FileExists(FileDB) then
FDB.LoadFromFile(FileDB);
for i := 0 to Request.Files.Count - 1 do
begin
FN := Request.Files[i].FileName;
if (FN <> '')and(Request.Files[i].Size > 0) then
begin
CopyFile(Request.Files[i].LocalFileName, UploadDir + FN);//copy (or overwrite) the file to the upload dir
if FDB.Values[FN] <> '' then
FDB.Values[FN] := Uploader //overwrite the previous uploader
else
FDB.Add(FN + '=' + Uploader); //store the file and the uploader into the file database
end;
end;
FDB.SaveToFile(FileDB);
FDB.Free;
end;
end;
procedure TFPWebModule1.listfilesRequest(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
var
FN:String;
begin
Template.FileName := 'uploadform.html';
Template.AllowTagParams := true;
Template.StartDelimiter := '{+';
Template.EndDelimiter := '+}';
Template.OnReplaceTag := @listfilesReplaceTag;
FN := ARequest.QueryFields.Values['DELETE'];
if FN <> '' then
DeleteTheFile(FN)
else
HandleUploadedFiles;
AResponse.Content := Template.GetContent;//Generate the response page using the template
Handled := true;
end;
procedure TFPWebModule1.listfilesReplaceTag(Sender: TObject; const TagString:
String; TagParams: TStringList; Out ReplaceText: String);
var
SL:TStringList;
i:Integer;
FileName, Uploader, One_Row:String;
begin
if AnsiCompareText(TagString, 'DATETIME') = 0 then
begin
ReplaceText := FormatDateTime(TagParams.Values['FORMAT'], Now);
end else
if AnsiCompareText(TagString, 'MAX_SIZE') = 0 then
begin
ReplaceText := IntToStr(MaxSize);
end else
if AnsiCompareText(TagString, 'UPLOAD_DIR') = 0 then
begin
ReplaceText := UploadDir;
end else
if AnsiCompareText(TagString, 'MESSAGES') = 0 then
begin
ReplaceText := TagParams.Values[Request.QueryFields.Values['_MSG']];
end else
if AnsiCompareText(TagString, 'FILELIST') = 0 then
begin
SL := TStringList.Create;
if FileExists(FileDB) then
SL.LoadFromFile(FileDB);
if SL.Count > 0 then
begin
One_Row := TagParams.Values['ONE_ROW'];
for i := 0 to SL.Count - 1 do
begin
FileName := SL.Names[i];
Uploader := SL.Values[FileName];
if (FileName <> '')and(Uploader <> '') then
ReplaceText := ReplaceText + StringReplace(StringReplace(StringReplace(One_Row
,'~FILENAME', FileName, [])
,'~UPLOADER', Uploader, [])
,'~DFILENAME', HTTPEncode(FileName), []) + #13#10;
end;
end else begin
ReplaceText := TagParams.Values['NOTHINGTOLIST'];
end;
SL.Free;
end else
{Message for tags not handled}
begin
ReplaceText := '[Template tag {+' + TagString + '+} is not implemented yet.]';
end;
end;
initialization
{$I webmodule.lrs}
RegisterHTTPModule('TFPWebModule1', TFPWebModule1);
end.