Converting short upload URLs to full URLs

I may be barking up the wrong tree here, so apologies if I am - but any pointers very much welcome!

There are some threads in our Discourse site which are displayed in part on our main website. Because the cooked version of a post contains all the HTML for the lightbox, which we don’t want on the main site, I’m working with the raw version of a post.

One thing that’s tripping me up is the file upload URLs. How can I convert an upload:// URL to a full URL? I’ve tried searching and come across SHA1 and Base62, but apart from that, no matter what I try, I can’t get the full URL.

As I said, I may looking at the wrong thing, or there’s (likely) to be an easier way to these things, so any advice welcome!

Thanks in advance

3 Mi Piace

First base62 decode using the inverted character set, then hex encode the result.

In Python code it looks like this:

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

8 Mi Piace

Thanks for the swift reply @michaeld. Will give it a go later today :slight_smile:


For anyone interested and doing this in PHP, I used a composer library called base62 by tuupola.

This is the code I used:

<?php

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

/** Set the original file name, excluding any file extensions */
$s = "r3AYqESanERjladb4vBB7VsMBm6";

/** Decode, convert to hex */
$decoded = $base62->decode($s);

/** Expected result: bda2c513e1da04f7b4e99230851ea2aafeb8cc4e */
echo bin2hex($decoded);
2 Mi Piace

Interessante. Non riesco a riprodurlo con Javascript. Poiché il tuo ultimo metodo è una conversione binary2hex, ma il risultato della decodifica base62 non è una rappresentazione binaria, per quanto ne capisco.

Da una prospettiva JS, ho trovato utili i seguenti elementi:
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;
}

Sfortunatamente, né i metodi bin2hex né dec2hex aiutano quando uso le tue stringhe di input.

Ho creato un codesandbox per questo problema, se qualcuno è interessato a giocarci. Il valore finale è 1 per la mia stringa di input, il che è sbagliato ;(

Grazie

Dovresti essere in grado di usare binVal.toString(16) per ottenere il valore esadecimale.
Tuttavia, penso (!) che il risultato intermedio sia troppo grande per essere inserito in un intero normale.

2 Mi Piace

Grazie per il suggerimento Richard, ma non sto andando avanti nemmeno con quell’idea.

Non so se non sarebbe una buona funzionalità avere un’impostazione del tipo “Abilita link di caricamento assoluti nelle visualizzazioni raw (route)”. La userei assolutamente nel nostro caso, perché, per quanto ne so, l’accorciamento degli URL di caricamento è solo un’ottimizzazione di discourse per ridurre il codice, giusto? Non è correlato a Markdown.

Qualcuno del team di Discourse può fornire un metodo JS in grado di ripristinare l’URL assoluto?
Sarebbe utile per la community, pensateci.
Non riesco a farlo ;(

@RGJ conosci qualcuno del team Discourse che possa fornire quella funzione di supporto?

No…
Ti suggerirei di pubblicare questo in Marketplace.

1 Mi Piace

Potresti dire di più sul tuo caso d’uso. Forse questa non è la soluzione migliore.

Puoi convertire da base62 a hex, ma non sarai mai in grado di ricostruire completamente l’URL di caricamento senza un qualche tipo di interfaccia al database di Discourse. Il percorso completo per un caricamento dipende dall’id del caricamento, che non può essere determinato dall’URL breve.

Come ha detto @pfaffman, potremmo essere in grado di aiutarti di più se descrivi il tuo caso d’uso.

4 Mi Piace