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 « J'aime »

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 « J'aime »

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 « J'aime »

Intéressant. Je ne parviens pas à reproduire cela avec Javascript. Parce que votre dernière méthode est une conversion binaire vers hexadécimal, mais le résultat du décodage base62 n’est pas une représentation binaire d’après ce que je comprends.

D’un point de vue JS, j’ai trouvé les éléments suivants utiles :
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;
}

Malheureusement, ni les méthodes bin2hex ni dec2hex n’aident lorsque j’utilise vos chaînes d’entrée.

J’ai créé un codesandbox pour ce problème si quelqu’un est intéressé à jouer avec. La valeur finale est 1 pour ma chaîne d’entrée, ce qui est faux ;(

Merci

Vous devriez pouvoir faire binVal.toString(16) pour obtenir la valeur hexadécimale.
Cependant, je pense (!) que le résultat intermédiaire est trop grand pour tenir dans un entier normal.

2 « J'aime »

Merci pour l’indice Richard, mais je n’avance pas plus loin, même avec cette idée.

Je ne sais pas si ce ne serait pas une bonne fonctionnalité d’avoir un réglage du genre “Activer les liens de téléchargement absolus dans les vues brutes (routes)”. Je l’utiliserais totalement dans notre cas - car, d’après ce que je comprends, le raccourcissement des URL de téléchargement n’est vraiment qu’une optimisation de Discourse pour réduire le code, n’est-ce pas ? Ce n’est pas lié au Markdown.

Quelqu’un de l’équipe Discourse peut-il fournir une méthode JS qui peut restaurer l’URL absolue ?
Ce serait utile pour la communauté, réfléchissez.

Je n’arrive pas à y parvenir ;(

@RGJ connaissez-vous quelqu’un dans l’équipe Discourse pour fournir cette fonction d’aide ?

Non…
Je vous suggère de poster ceci dans Marketplace.

1 « J'aime »

Vous pourriez en dire plus sur votre cas d’utilisation. Ce n’est peut-être pas la meilleure solution.

Vous pouvez convertir de la base 62 en hexadécimal, mais vous ne pourrez jamais reconstruire entièrement l’URL de téléversement sans une sorte d’interface à la base de données de Discourse. Le chemin complet vers un téléversement dépend de l’id du téléversement, qui ne peut pas être déterminé à partir de l’URL courte.

Comme l’a dit @pfaffman, nous pourrions être en mesure de vous aider davantage si vous décrivez votre cas d’utilisation.

4 « J'aime »