将短上传 URL 转换为完整 URL

我可能在这里搞错了,如果真是这样,请见谅——但非常欢迎任何指点!

我们 Discourse 站点上的一些帖子会部分显示在我们的主网站上。由于帖子的“已渲染”版本包含了灯箱所需的全部 HTML,而我们并不希望主网站显示这些内容,因此我正在使用帖子的原始版本。

让我感到困惑的是文件上传链接。如何将 upload:// 链接转换为完整 URL?我尝试搜索过,找到了 SHA1 和 Base62 等相关信息,但除此之外,无论我尝试什么方法,都无法获取完整 URL。

正如我前面所说,我可能找错了方向,或者(很可能)存在更简单的方法来实现这些功能,因此非常欢迎任何建议!

提前感谢

首先使用反转字符集进行 base62 解码,然后对结果进行十六进制编码。

在 Python 代码中,它看起来像这样:

rebase = hex(base62.decode(base, base62.CHARSET_INVERTED))[2:].zfill(40)

感谢 @michaeld 的快速回复。我今天晚些时候会尝试一下。 :slight_smile:


对于任何感兴趣并打算在 PHP 中实现此功能的人,我使用了一个名为 base62 by tuupola 的 Composer 库。

这是我使用的代码:

<?php

$base62 = new Tuupola\Base62(["characters" => Tuupola\Base62::INVERTED]);

/** 设置原始文件名,不包括任何文件扩展名 */
$s = "r3AYqESanERjladb4vBB7VsMBm6";

/** 解码并转换为十六进制 */
$decoded = $base62->decode($s);

/** 预期结果:bda2c513e1da04f7b4e99230851ea2aafeb8cc4e */
echo bin2hex($decoded);

很有趣。我无法用 Javascript 复现这一点。因为据我所知,您最后的方法是 binary2hex 转换,但 base62 解码的结果不是二进制表示。

从 JS 的角度来看,我发现以下内容很有帮助:
https://www.npmjs.com/package/aybabtu

function fromBase62(s) {
  var digits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  var result = 0;
  for (var i = 0; i < s.length; i++) {
    var p = digits.indexOf(s[i]);
    if (p < 0) {
      return NaN;
    }
    result += p * Math.pow(digits.length, s.length - i - 1);
  }
  return result;
}

不幸的是,当我使用您的输入字符串时,bin2hex 和 dec2hex 方法都没有帮助。

我为此问题创建了一个 codesandbox,有兴趣的人可以尝试一下。我的输入字符串的最终值为 1,这是错误的;(

谢谢

您应该能够使用 binVal.toString(16) 来获取十六进制值。
不过,我认为(!)中间结果太大,无法放入常规整数中。

感谢你的提示 Richard,但即使有了这个想法,也还是没有进展。

我不知道,是不是应该有一个类似“在原始视图(路由)中启用绝对上传链接”的设置?在我们的情况下,我绝对会使用它——因为据我所知,上传 URL 缩短只是 Discourse 的一种优化,目的是为了减少代码量,对吧?它与 Markdown 无关。

是否有 Discourse 团队的成员可以提供一个可以恢复绝对 URL 的 JS 方法?
这对社区很有帮助,请考虑一下。

我无法做到 ;(

@RGJ 你认识 Discourse 团队的人可以提供那个辅助函数吗?

不……
我建议你把这个发到 Marketplace

您或许可以多谈谈您的用例。也许这不是最佳解决方案。

您可以通过 base62 转换为十六进制,但如果没有某种接口连接到 Discourse 的数据库,您将永远无法完全重建上传 URL。上传的完整路径取决于上传的 id,这无法从短 URL 中确定。

正如 @pfaffman 所说,如果您能描述您的用例,我们或许能提供更多帮助。