Какой лучший способ URLE кодировать имя файла в Delphi? - PullRequest
4 голосов
/ 15 марта 2012

Мое настольное приложение должно загружать файл из интернета.Путь к файлу известен, само имя файла является полувариабельным, то есть кто-то другой будет помещать туда новые файлы, и мое приложение должно будет загрузить их.

Теперь я хочу убедиться, что URL-адресэто безопасно, и это будет правильно интерпретировано.Кроме того, если в имени файла есть «#» (вы никогда не знаете), я хочу, чтобы оно было закодировано.Javascript имеет две разные функции для этого: encodeURI и encodeURIComponent.Последний, кроме всего прочего, также кодирует символы #.Конечно, я мог бы свернуть свой собственный, но я решил, что для этого обязательно должны быть функции, и я мог бы также избежать некоторой старой ошибки.

Я буду загружать файл с объектом, который используетсерия API-функций WinInet ( InternetOpen и тому подобное).

Итак, я начал копаться в MSDN и, конечно же, есть UrlCanonicalize .Но есть также UrlEscape , CreateUri (но его нет в блоках Delphi 2010) и, наконец, InternetCreateUrl , что требует от меня разделения всего URL.Я бы предпочел объединить первую часть URL-адреса с именем файла, закодированным URLE.

Кроме того, все они имеют тонны различных флагов, различных значений по умолчанию, которые изменились в течение версий Windows, и я не могувыяснить различия больше.Кто-нибудь знает, какой из них лучше для этой цели?

Ответы [ 2 ]

9 голосов
/ 15 марта 2012

попробуйте функцию TIdURI.PathEncode (находится в блоке idURI), которая является частью библиотеки Indy, включенной в delphi.

{$APPTYPE CONSOLE}

{$R *.res}

uses
  idURI,
  SysUtils;

Var
  FileName : string;
  Encoded  : string;
begin
  try
   FileName:='File with a Very weird f***name*#%*#%<>[]';
   Encoded:=TIdURI.PathEncode(FileName);
   Writeln(Encoded);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Это вернет

File%20with%20a%20Very%20weird%20f%2A%2A%2Aname%2A%23%25%2A%23%25%3C%3E%5B%5D

Также вы можете взглянуть на функции TIdURI.URLDecode и TIdURI.URLEncode.

2 голосов
/ 16 марта 2012

Для проекта xxm я написал свою собственную функцию URLEncode:

http://xxm.svn.sourceforge.net/viewvc/xxm/trunk/Delphi/bin/public/xxm.pas?view=markup#l287

...