>我在数据库字段中存储了一个相对路径。它看起来像这样:
/images/2012-6/file.jpg
我可以通过以下方式访问绝对网址:
http://www.blah.com/images/2012-6/file.jpg
缩略图相对路径不存储在数据库表中。但是我知道它可以在以下位置找到:
http://www.blah.com/images/thumbnails/2012-6/file.jpg
鉴于我知道http://www.blah.com/
和/images/2012-6/file.jpg
,确定的最佳算法是什么:
http://www.blah.com/images/thumbnails/2012-6/file.jpg
注意:命名方案可以是相对路径和缩略图文件夹根路径上的多个文件夹。 /images/whatever/something/thumbnails/"
.
您可以做出的唯一假设是两者都以相同的第一段(文件夹)开头。 /images/
.
这是在控制台应用程序中(如果我能提供帮助,没有System.Web
)。这是我迄今为止想出的最好的:
public static void Main()
{
var test = GetThumbnail("http://www.blah.com/", "/images/folder/subfolder/test/again/filename.jpg", "/images/extra/thumbnails/");
Console.WriteLine(test);
}
private static string GetThumbnail(string baseUriString, string relativePath, string thumbsPath)
{
var root = new Uri(baseUriString, UriKind.Absolute);
var absolute = new Uri(root, relativePath);
var segments = absolute.Segments;
var thumbnailUri = new Uri(root, thumbsPath);
var thumbSegments = thumbnailUri.Segments;
var matchedRoot = Array.IndexOf(segments, thumbSegments[1]);
var builder = new UriBuilder(root);
for (var j = 1; j < segments.Length; j++)
{
if (j == matchedRoot)
{
for (var k = 1; k < thumbSegments.Length; k++)
{
builder.Path += thumbSegments[k];
}
}
else
{
builder.Path += segments[j];
}
}
return builder.Uri.ToString();
}
这似乎令人费解。有什么更好的方法吗?
如果我正确理解了您的要求,那么您从根本上希望:
- 将路径分成多个段
- 查找重叠的第一段
- 将所有拇指段插入 Uri 中的该位置。
您的代码已经在这样做,但我相信以下代码使这些步骤更加清晰:
private static string GetThumbnail(string baseUriString, string relativePath, string thumbsPath)
{
// 1. Break the paths into segments
// the trim here is important to prevent empty list items or "//" when we rebuild later.
List<string> relativeSegments = relativePath.Trim('/').Split('/').ToList();
List<string> thumbsSegments = thumbsPath.Trim('/').Split('/').ToList();
// 2. Find the first segment of thumbs in the relative segments
int sharedSegmentIndex = relativeSegments.IndexOf(thumbsSegments[0]);
// 3. Insert all the thumbs segments into that spot in the Uri.
// remove the overlapping segment (because we're adding it again below)
relativeSegments.RemoveAt(sharedSegmentIndex);
// insert the thumbs segment
relativeSegments.InsertRange(sharedSegmentIndex, thumbsSegments);
// build up the full path.
var root = new Uri(baseUriString, UriKind.Absolute);
var builder = new UriBuilder(root);
builder.Path += string.Join("/", relativeSegments);
return builder.Uri.ToString();
}
另外,这是我的快速而肮脏的测试套件,因此您可以检查我是否制作了正确的所需输出,以及其他想要修补的人。
public static void Main()
{
RunTest("http://www.blah.com/", "/images/2012-6/file.jpg", "/images/thumbnails/", "http://www.blah.com/images/thumbnails/2012-6/file.jpg");
RunTest("http://www.blah.com/", "/images/folder/subfolder/test/again/filename.jpg", "/images/extra/thumbnails/", "http://www.blah.com/images/extra/thumbnails/folder/subfolder/test/again/filename.jpg");
RunTest("http://www.blah.com/", "/myapp/images/folder/subfolder/test/again/filename.jpg", "/images/extra/thumbnails/", "http://www.blah.com/myapp/images/extra/thumbnails/folder/subfolder/test/again/filename.jpg");
}
public static void RunTest(string baseUriString, string relativePath, string thumbsPath, string expected)
{
var result = GetThumbnail(baseUriString, relativePath, thumbsPath);
Debug.Assert(result == expected);
}