在Delphi中URLEncode文件名的最佳方式是什么?
我的桌面应用程序必须从互联网下载文件。该文件的路径是已知的,文件名本身是半变量的,即其他人将在那里放置新文件,并且我的应用程序将不得不下载这些文件。在Delphi中URLEncode文件名的最佳方式是什么?
现在我想确保URL是安全的,并且它会被正确解释。另外,如果文件名中有'#'(你永远不知道),我确实希望它被编码。 JavaScript有两个截然不同的功能:encodeURI
和encodeURIComponent
。后者还编码'#'字符等等。 当然,我可以推出自己的产品,但我认为必定会有一些功能为此做好准备,而且我不妨犯一些旧错误。
我将用一个使用WinInet系列API函数(InternetOpen之类)的对象下载文件。
所以我开始在MSDN上翻找,果然有UrlCanonicalize。但也有UrlEscape,CreateUri(但这不在德尔福2010年单位),最后InternetCreateUrl,这需要我分裂整个URL。我宁愿将URL的第一部分与URLEncoded文件名连接起来。
此外,它们都有不同的标志,不同的默认值在Windows版本的过程中发生了变化,我无法找出差异。有人知道哪一个最适合这个目的?
尝试TIdURI.PathEncode
函数(位于idURI单元中),该函数是delphi包含的Indy库的一部分。
{$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
功能看看。
对于xxm项目,我写我自己的URLEncode功能:
http://xxm.svn.sourceforge.net/viewvc/xxm/trunk/Delphi/bin/public/xxm.pas?view=markup#l287
的名称应该是十六进制%编码。我不知道哪个功能可以做到这一点。 – Deanna 2012-03-15 17:16:21
我在我的问题中提到的所有功能在某些时候都会这样做。我不清楚哪些字符会使用哪些标记进行编码,以及是否所有unicode字符都能正确编码。 – Martijn 2012-03-15 17:19:17
要小心。仅仅因为你已经收到了正确编码的文件名并不意味着它是你应该使用的文件名。如果您收到带有路径组件的文件名,尤其是相对路径组件(如'..'),则可能会无意中覆盖您不期望的文件。 – 2012-03-15 17:58:14