短いアップロードURLを完全なURLに変換する

もしかすると、間違っているかもしれませんが、もしそうでしたらお詫びします。もしご助言があれば、大変感謝いたします!

Discourse サイトには、メインウェブサイトの一部に表示されているスレッドがいくつかあります。投稿の「調理済み(cooked)」バージョンには、ライトボックス用のすべての HTML が含まれているため、メインサイトでは表示したくありません。そのため、投稿の「生(raw)」バージョンを使用しています。

ここでつまずいているのが、ファイルアップロードの URL です。upload:// という形式の URL を完全な URL に変換する方法はありますか?SHA1 や Base62 について検索してみましたが、それ以外にどのような方法を試しても、完全な URL を取得することができません。

前述の通り、私が間違った方向を見ている可能性もありますし、おそらくより簡単な方法があるはずです。したがって、ご助言を歓迎いたします!

あらかじめありがとうございます。

まず、逆順の文字セットを使用して base62 デコードし、その後、結果を hex エンコードします。

Python コードでは以下のようになります:

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

@michaeld さん、迅速なご返信をありがとうございます。本日の遅くに試してみます :slight_smile:


PHP でこれを実装したい方のためですが、私は tuupola の base62 という Composer ライブラリを使用しました。

使用したコードは以下の通りです:

<?php

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

/** 拡張子を除く元のファイル名を設定 */
$s = "r3AYqESanERjladb4vBB7VsMBm6";

/** デコードして 16 進数に変換 */
$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) を使用して16進数の値を取得できるはずです。
ただし、中間結果が通常の整数に収まらないほど大きいと思います(!)。

リチャード、ヒントをありがとう。しかし、そのアイデアを使っても、さらに進展はありません。

「生のビュー(ルート)で絶対的なアップロードリンクを有効にする」のような設定があると良いと思いませんか?私の理解では、アップロードURLの短縮は、単にコードを減らすためのDiscourseの最適化ですよね?Markdownとは関係ありません。私たちのケースでは、まさにそれを使います。

ディスコースチームの誰か、絶対URLを復元できるJSメソッドを提供してもらえませんか?
コミュニティにとって役立つでしょう、考えてみてください。

私はこれを達成できませんでした ;(

@RGJ Discourseチームの誰かを知っていて、そのヘルパー関数を提供してもらえますか?

いいえ…
Marketplace に投稿することをお勧めします。

ユースケースについてもう少し詳しく教えていただけますか。もしかしたら、これが最善の解決策ではないかもしれません。

Base62から16進数に変換することはできますが、Discourseのデータベースへの何らかのインターフェースなしでは、アップロードURLを完全に再構築することはできません。アップロードの完全なパスは、アップロードのidに依存しており、これは短いURLからは決定できません。

@pfaffmanが言ったように、ユースケースを説明していただければ、さらに詳しい情報を提供できるかもしれません。