altagur Posted December 10, 2013 Share Posted December 10, 2013 I need to post files to client. I am not find such event in unigui. I am catch event in procedure TIdCustomHTTPServer.DoCommandGet where TMethod(FOnCommandGet).Data is TUniExtServer How to get current TUniExtSession from TUniExtServer and while such requests localhost:8077/tmp/myfile.jpg?cmd=1&id=2 not translated by TUniExtServer to procedure TIdExtSession.HandleRequest()? Please help me. I need drop file from brauser to desctop in google chrome i altready write javascript and now need catch file request to generate file dinamically from database. For this i need MainDataModule from UniSession in TIdCustomHTTPServer.DoCommandGet or translation localhost:8077/tmp/myfile.jpg?cmd=1&id=2 to TIdExtSession.HandleRequest or event in unigui for user manual params and request handling Please help Link to comment Share on other sites More sharing options...
altagur Posted December 10, 2013 Author Share Posted December 10, 2013 for handling requests like localhost:8077?cmd=1&id=12375 define project define GUR if main database module named MainData from file dtHtmlMain In module ExtHTTPServer; in uses after implementation insert uses implementationuses{$IFDEF GUR} UniGUIApplication,dtHtmlMain,{$ENDIF} and change TIdExtSession.HandleRequest( procedure TIdExtSession.HandleRequest(ARequest: TIdHTTPRequestInfo; AResponse: TIdHTTPResponseInfo);(* added *){$WARNINGS OFF}(* added *) function CheckIfFileIsModified(FileName: string): Boolean; const FCompareDateFmt = 'yyyymmddhhnnss'; var FFileDateTime: TDateTime; begin Result := True; if (ARequest.RawHeaders.Values['if-Modified-Since'] <> '') then begin FFileDateTime := FileDateToDateTime(FileAge(FileName)); Result := not SameText(FormatDateTime(FCompareDateFmt, FFileDateTime), FormatDateTime(FCompareDateFmt, StrInternetToDateTime(ARequest.RawHeaders.Values['if-Modified-Since']))); end; end; function TryToServeFile: boolean; var FileName: string; FileDateTime: TDateTime; begin FileName := ExtractFilePath(ParamStr(0)); FileName := StringReplace(FileName, ExtractFileDrive(FileName), '', []); if (Length(ARequest.Document) > 1) and (ARequest.Document[1]in ['/', '\']) then FileName := FileName + Copy(ARequest.Document, 2, MaxInt) else FileName := FileName + ARequest.Document; FileName := ExpandFilename(FileName); if FileExists(FileName) then begin Result := True; if CheckIfFileIsModified(FileName) then begin AResponse.ContentStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); AResponse.FreeContentStream := True; AResponse.ContentLength := AResponse.ContentStream.Size; FileDateTime := FileDateToDateTime(FileAge(FileName)); AResponse.LastModified := FileDateTime; AResponse.ContentType := FileType2MimeType(FileName); end else AResponse.ResponseNo := 304; //Not Modified, use cache version end else begin(* added *) AResponse.ResponseNo := 404; //Not found(* added *) Result := false; end; end; function TryToServeDiskFile(FileName: String): boolean; var FileDateTime: TDateTime; begin if FileExists(FileName) then begin Result := True; if CheckIfFileIsModified(FileName) then begin AResponse.ContentStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); AResponse.FreeContentStream := True; AResponse.ContentLength := AResponse.ContentStream.Size; FileDateTime := FileDateToDateTime(FileAge(FileName)); AResponse.LastModified := FileDateTime; AResponse.ContentType := FileType2MimeType(FileName); end else AResponse.ResponseNo := 304; //Not Modified, use cache version end else begin(* added *) AResponse.ResponseNo := 404; //Not found(* added *) Result := false; end; end;(* added *){$WARNINGS ON}(* added *)type MethodCall = procedure of object;var PageMethod : TMethod; MethodCode : pointer;{$IFDEF GUR}var AID: variant; ACmd: Integer; AFileName: String;{$ENDIF}begin(* deleted *)//CurrentFCGIThread := Self;(* deleted *)(* added *) SetCurrentFCGIThread(Self);(* added *) FCurrentRequest := ARequest; FCurrentResponse := AResponse;// FCurrentResponse.CacheControl:='no-cache';(* deleted *){ if ARequest.Cookies.GetCookieIndex(0, 'FCGIThread') = -1 then with AResponse.Cookies.Add do begin CookieName := 'FCGIThread'; Value := SessionID; ARequest.Cookies.AddSrcCookie(CookieText); end; AResponse.ContentType := 'text/html'; // this changes charset in D2011 see #0000531}(* deleted *) if Length(ARequest.Params.Values['cmd'])>0 then begin Response := ''; end; Response := ''; FParams.DelimitedText := FCurrentRequest.UnParsedParams; if BeforeHandleRequest then if PathInfo = '' then begin{$IFDEF GUR} if Length(ARequest.Params.Values['cmd'])>0 then begin ACmd := StrToInt(ARequest.Params.Values['cmd']); case ACmd of 0: // file begin AID := StrToFloat(ARequest.Params.Values['id']); if TMainData(TUNIGUISession(Self).UniMainModule).PutToTmpFile(AID, AFileName) then //; if FileExists(FILE_ROOT + ARequestInfo.Document) then begin TryToServeDiskFile(AFileName); //AResponse.ServeFile(AContext, AFileName); end; end; end; end //; else{$ENDIF} Home; end else begin MethodCode := MethodAddress(PathInfo); if MethodCode <> nil then begin PageMethod.Code := MethodCode; PageMethod.Data := Self; try{$IFDEF GUR} if Length(ARequest.Params.Values['cmd'])>0 then begin ACmd := StrToInt(ARequest.Params.Values['cmd']); case ACmd of 0: // file begin AID := StrToFloat(ARequest.Params.Values['id']); if TMainData(TUNIGUISession(Self).UniMainModule).PutToTmpFile(AID, AFileName) then //; if FileExists(FILE_ROOT + ARequestInfo.Document) then begin TryToServeDiskFile(AFileName); //AResponse.ServeFile(AContext, AFileName); end; end; end; end //; else{$ENDIF} MethodCall(PageMethod); // Call published method except on E : Exception do OnError(E, E.Message, PathInfo, FCurrentRequest.UnParsedParams); end; end else begin if not TryToServeFile then OnNotFoundError; end; end; AfterHandleRequest; if not Assigned(AResponse.ContentStream) and (Response <> '') and (AResponse.ResponseNo <> 304) then FCurrentResponse.ContentText := Response;end; In tunihtmlframe you can define startdrag function <script type="text/javascript"> function dragStart(evt){ fID = MyForm.MyLabel.text; files = "application/octet-stream:"+fName+":"+document.location+"?cmd=0&id="+fID; event.dataTransfer.setData("DownloadURL",files); return true;} and register procedure var box = document.getElementById(MYForm.MyGrid.id); box.addEventListener("dragstart", dragStart, false);</script> Its way to dragdrop files from tunidbgrid in browser to desctop Work only in googlechrome. Possible unigui developers included event in MainModule on with done like function TUniguiSession.BeforeHandleRequest : boolean; override; begin if Assigned (MainDataModule.FOnBeforeHanle) then Result := MainDataModule.FOnBeforeHanle(CurrentRequest ,CurrentResponse) else inherited; ) end; Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now