Conversión de URLs de subida cortas a URLs completas

Puede que esté buscando en el lugar equivocado, así que disculpen si es así, ¡pero cualquier orientación será muy bienvenida!

Hay algunos hilos en nuestro sitio Discourse que se muestran parcialmente en nuestro sitio web principal. Dado que la versión procesada de una publicación contiene todo el HTML para el lightbox, lo cual no queremos en el sitio principal, estoy trabajando con la versión sin procesar de la publicación.

Una cosa que me está resultando complicada son las URLs de carga de archivos. ¿Cómo puedo convertir una URL upload:// en una URL completa? He intentado buscar y me he encontrado con SHA1 y Base62, pero, aparte de eso, no importa lo que intente, no consigo obtener la URL completa.

Como dije, puede que esté mirando por el lado equivocado, o que haya (probablemente) una forma más sencilla de hacer estas cosas, ¡así que cualquier consejo será bienvenido!

Gracias de antemano

Primero decodifica en base62 usando el conjunto de caracteres invertido, luego codifica en hexadecimal el resultado.

En código de Python se ve así:

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

Gracias por la rápida respuesta, @michaeld. Lo probaré más tarde hoy :slight_smile:


Para cualquiera que esté interesado y lo esté haciendo en PHP, utilicé una biblioteca de Composer llamada base62 de tuupola.

Este es el código que utilicé:

<?php

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

/** Establece el nombre original del archivo, excluyendo cualquier extensión */
$s = "r3AYqESanERjladb4vBB7VsMBm6";

/** Decodifica y convierte a hexadecimal */
$decoded = $base62->decode($s);

/** Resultado esperado: bda2c513e1da04f7b4e99230851ea2aafeb8cc4e */
echo bin2hex($decoded);

Interesante. No puedo reproducir esto con Javascript. Porque tu último método es una conversión binaria a hexadecimal, pero el resultado de la decodificación base62 no es una representación binaria, según entiendo.

Desde una perspectiva de JS, encontré útil lo siguiente:
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;
}

Desafortunadamente, ni los métodos bin2hex ni dec2hex ayudan, cuando uso tus cadenas de entrada.

Creé un codesandbox para ese problema si alguien está interesado en jugar con él. El valor final es 1 para mi cadena de entrada, lo cual es incorrecto ;(.

Gracias.

Deberías poder usar binVal.toString(16) para obtener el valor hexadecimal. Sin embargo, ¡creo(!) que el resultado intermedio es demasiado grande para caber en un entero normal.

Gracias por la pista Richard, pero ni siquiera con esa idea estoy avanzando.

No sé, ¿no sería una buena característica tener una configuración del tipo “Habilitar enlaces de carga absolutos en vistas sin procesar (rutas)”? Yo la usaría totalmente en nuestro caso, porque, según entiendo, el acortamiento de URL de carga es solo una optimización de Discourse para reducir código, ¿verdad? No está relacionado con Markdown.

¿Alguien del equipo de Discourse puede proporcionar un método JS que pueda restaurar la URL absoluta?
Sería útil para la comunidad, piénsalo.

No puedo lograr esto ;(

@RGJ ¿conoces a alguien del equipo de Discourse que pueda proporcionar esa función de ayuda?

No…
Te sugiero que publiques esto en Marketplace.

Podrías decir más sobre tu caso de uso. Quizás esta no sea la mejor solución.

Puedes convertir de base62 a hexadecimal, pero nunca podrás reconstruir completamente la URL de carga sin algún tipo de interfaz a la base de datos de Discourse. La ruta completa a una carga depende del id de la carga, que no se puede determinar a partir de la URL corta.

Como dijo @pfaffman, podríamos ayudarte más si describes tu caso de uso.