这不是关于编码URL的问题,更多的是与我注意到的问题有关,我注意到你在IIS上有一个有效的文件名,如“test& test.jpg”,但由于& amp;导致错误。还有其他角色也可以在Windows中有效,但不适用于网络。
我的快速解决方案是在使用下面的正则表达式保存之前更改文件名...
public static string MakeFileNameWebSafe(string fileNameIn)
{
string pattern = @"[^A-Za-z0-9. ]";
string safeFilename = System.Text.RegularExpressions.Regex.Replace(fileNameIn, pattern, string.Empty);
if (safeFilename.StartsWith(".")) safeFilename = "noname" + safeFilename;
return safeFilename;
}
但我想知道是否有更好的内置方式来做到这一点。
答案 0 :(得分:3)
内置我不知道。
您可以做的就是扫描原始文件名并生成Web安全版本。
对于此类Web安全版本,您可以将其显示为博客和博客类别中的slu((这些是搜索引擎优化的):
所以"测试& test.jpg放在"会翻译成" test-and-test.jpg"。
答案 1 :(得分:3)
回顾这个问题,因为它相当受欢迎。虽然我会在这里发布我当前的解决方案,并为任何想要它的人提供各种重载...
public static string MakeSafeFilename(string filename, string spaceReplace)
{
return MakeSafeFilename(filename, spaceReplace, false, false);
}
public static string MakeSafeUrlSegment(string text)
{
return MakeSafeUrlSegment(text, "-");
}
public static string MakeSafeUrlSegment(string text, string spaceReplace)
{
return MakeSafeFilename(text, spaceReplace, false, true);
}
public static string MakeSafeFilename(string filename, string spaceReplace, bool htmlDecode, bool forUrlSegment)
{
if (htmlDecode)
filename = HttpUtility.HtmlDecode(filename);
string pattern = forUrlSegment ? @"[^A-Za-z0-9_\- ]" : @"[^A-Za-z0-9._\- ]";
string safeFilename = Regex.Replace(filename, pattern, string.Empty);
safeFilename = safeFilename.Replace(" ", spaceReplace);
return safeFilename;
}
答案 2 :(得分:1)
我认为您指的是“从客户端检测到一个潜在危险的Request.Path值(%)”错误,Asp.Net针对包含可能表示跨站点脚本尝试的字符的路径抛出错误:
有一篇关于如何解决这个问题的好文章:
答案 3 :(得分:1)
这是我使用的那个:
public static string MakeFileNameWebSafe(string path, string replace, string other)
{
var folder = System.IO.Path.GetDirectoryName(path);
var name = System.IO.Path.GetFileNameWithoutExtension(path);
var ext = System.IO.Path.GetExtension(path);
if (name == null) return path;
var allowed = @"a-zA-Z0-9" + replace + (other ?? string.Empty);
name = System.Text.RegularExpressions.Regex.Replace(name.Trim(), @"[^" + allowed + "]", replace);
name = System.Text.RegularExpressions.Regex.Replace(name, @"[" + replace + "]+", replace);
if (name.EndsWith(replace)) name = name.Substring(0, name.Length - 1);
return folder + name + ext;
}
答案 4 :(得分:0)
如果您不关心保留原始名称,也许您只需用guid替换名称?