如何从两个部分 Uri 和一个假设反向计算 Url/Uri

  • 本文关键字:Uri 假设 一个 Url 计算 两个 c#
  • 更新时间 :
  • 英文 :


>我在数据库字段中存储了一个相对路径。它看起来像这样:

/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();
}

这似乎令人费解。有什么更好的方法吗?

如果我正确理解了您的要求,那么您从根本上希望:

  1. 将路径分成多个段
  2. 查找重叠的第一段
  3. 将所有拇指段插入 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);
    }

最新更新