Мне нужно было на свой собственный сервер отправлять запрос на получение картинки, например по адресу
1 |
http://localhost:40000/public/files/1/2017/1/9/Русский{EA1B9B79-AA95-424D-8AD2-AAE5BA023810}.png |
делал это через idHTTP.Get, но все русские символы либо обрезались либо уходили в виде ????????, уже сталкивался с этой проблемой, поэтому решил просто использовать System.NetEncoding следующим образом
uses
1 |
System.NetEncoding |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
procedure TDownloadPictureThread.DownloadPicture(RelativeLinkToPicture:String); var Stream: TMemoryStream; twic:twicImage; EncodedRelativeLink:String; begin Stream:=TMemoryStream.Create; twic:=twicImage.Create; try EncodedRelativeLink:=RelativeLinkToPicture.Substring(1); // removing first slash EncodedRelativeLink:=TNetEncoding.URL.Encode(EncodedRelativeLink); EncodedRelativeLink:= VisualFrame_HTTP.HTTPServerToRequest +'/'+ EncodedRelativeLink; with FVisualFrame_HTTP do begin IdHTTPDownload.Get(EncodedRelativeLink,Stream); Stream.Position:=0; twic.LoadFromStream(Stream); FBitmapDownLoaded.Assign(twic); end; finally FreeAndNil(Stream); FreeAndNil(Twic); end; end; |
Обратите внимание, кодирую только URI, то есть всегда должна быть часть
http://somehost:someport/
И далее, к ней можно плюсовать всё, что угодно, закодированное или нет.
А вот что на сервере в HTTPCommandGet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
procedure TfHTTPServer.IdHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); ... //Preparing file for download if it is on the Server begin URIDecoded:=TNetEncoding.URL.Decode(ARequestInfo.URI); // <<< if FHTTPServerCommandGet.IsFileOnServerByURI(URIDecoded,filepath,IsWebPage,WebPageContent) then begin AResponseInfo.ResponseNo := 200; if IsWebPage then AResponseInfo.ContentText:=WebPageContent else AResponseInfo.ServeFile(AContext, filepath); end else AresponseInfo.ResponseNo := 404; end; ... end; |