2011-07-19 59 views
1

做文件名网络安全这不是编码的URL的更多的事情要做,我注意到一个问题,你可以在IIS苏哈一个有效的文件名作为“测试& test.jpg放在”但这不能因下载到&导致错误。还有其他的字符也可以在Windows中有效,但不适用于网页。如何使用C#

我快速的解决方案是使用下面的正则表达式保存前更改文件名...

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; 
    } 

,但我不知道是否有任何更好的内置这样做的方法。

回答

3

内置我不知道。

你可以做的是,像你说的,扫描原稿的文件名,并产生它的Web安全版本。

对于这样的Web安全的版本,你可以使它看起来像在博客和博客类别蛞蝓(这是搜索引擎优化):

  • 只有小写字符
  • 允许使用数字
  • 破折号允许
  • 空间用破折号
  • 闲来无事允许
  • 也许你可以repla更换CE “&” 通过 “ - 和 - ”

因此, “测试& test.jpg放在” 将转化为 “测试和test.jpg放在”。

0

如果你不关心保留原来的名字或许你可以只更换一个GUID的名字吗?

+0

我通常会做这样的事情。 Guid或DB行标识,但在这种情况下,我需要保留文件名。我从来没有遇到过这个问题。我想人们不会经常把&文件名中,但它最终肯定会发生:) –

2

独立以来的相当受欢迎这个问题,就回头看。只是,虽然我会在这里发布我目前的解决方案持不同的重载谁想要它..

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; 
    } 
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; 
} 
+0

投票,尽管这里的所有答案似乎假定英文。 RegExp [^ a-zA-Z0-9]会过滤出“спутник.txt”(Russian SPUTNIK)等文件名。所以或许[^ \ w \。\ - ]会更好。另请参阅此SO帖子以匹配[亚洲语言字符](https://stackoverflow.com/questions/31840255) – Roberto