Преобразование коротких URL-адресов загрузки в полные URL-адреса

Возможно, я бью не в ту точку, так что извините, если это так, но любые советы будут очень кстати!

На нашем сайте Discourse есть некоторые темы, которые частично отображаются на нашем основном сайте. Поскольку обработанная версия поста содержит весь HTML для лайтбокса, который нам не нужен на основном сайте, я работаю с необработанной версией поста.

Одна вещь, которая меня сбивает с толку, — это URL-адреса загруженных файлов. Как преобразовать URL вида upload:// в полный URL? Я пытался искать и наткнулся на SHA1 и Base62, но, кроме этого, что бы я ни пробовал, я не могу получить полный URL.

Как я уже сказал, возможно, я смотрю не туда, или (скорее всего) есть более простой способ сделать это, так что любые советы приветствуются!

Заранее спасибо

Сначала выполните декодирование base62 с использованием инвертированного набора символов, затем выполните кодирование результата в шестнадцатеричный формат.

В коде на Python это выглядит так:

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

Спасибо за быстрый ответ @michaeld. Попробую сегодня позже :slight_smile:


Для всех, кто интересуется и делает это на PHP, я использовал библиотеку Composer под названием base62 by tuupola.

Вот код, который я использовал:

<?php

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

/** Установите исходное имя файла, исключив любые расширения */
$s = "r3AYqESanERjladb4vBB7VsMBm6";

/** Декодируйте и преобразуйте в шестнадцатеричный формат */
$decoded = $base62->decode($s);

/** Ожидаемый результат: bda2c513e1da04f7b4e99230851ea2aafeb8cc4e */
echo bin2hex($decoded);

Интересно. Мне не удаётся воспроизвести это с помощью JavaScript. Поскольку ваш последний метод представляет собой преобразование из двоичной системы в шестнадцатеричную, но результат декодирования base62, насколько я понимаю, не является двоичным представлением.

С точки зрения JavaScript мне помогли следующие материалы:
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), чтобы получить шестнадцатеричное значение. Однако, я думаю(!), что промежуточный результат слишком велик, чтобы поместиться в обычное целое число.

Спасибо за подсказку, Ричард, но даже с этой идеей я не продвинулся дальше.

Не знаю, не было бы хорошей функцией добавить настройку вроде «Включить абсолютные ссылки на загрузки в сыром виде (маршруты)». Я бы точно использовал это в нашем случае — потому что, насколько я понимаю, сокращение URL загрузок — это просто оптимизация Discourse для уменьшения кода, верно? Это не связано с Markdown.

Может ли кто-нибудь из команды Discourse предоставить JS-метод, который может восстановить абсолютный URL?
Думаю, это было бы полезно для сообщества.

Я не могу справиться с этим ;(

@RGJ, не знаешь ли кого-нибудь из команды Discourse, кто мог бы предоставить эту вспомогательную функцию?

Нет…
Я бы посоветовал вам опубликовать это в Marketplace.

Может быть, стоит рассказать подробнее о вашем сценарии использования. Возможно, это не самое подходящее решение.

Вы можете конвертировать из base62 в hex, но без какого-либо интерфейса к базе данных Discourse вы никогда не сможете полностью восстановить URL загрузки. Полный путь к загрузке зависит от id загрузки, который невозможно определить по короткому URL.

Как сказал @pfaffman, мы сможем помочь больше, если вы опишете свой случай использования.