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 curtidas

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 curtidas

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 curtidas

Interessante. Não consigo reproduzir isso com Javascript. Porque seu último método é uma conversão binária para hexadecimal, mas o resultado da decodificação base62 não é uma representação binária, pelo que entendi.

Do ponto de vista do JS, achei o seguinte útil:
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;
}

Infelizmente, nem os métodos bin2hex nem dec2hex ajudam quando uso suas strings de entrada.

Criei um codesandbox para esse problema, caso alguém esteja interessado em brincar com ele. O valor final é 1 para minha string de entrada, o que está errado ;(

Obrigado

Você deve ser capaz de usar binVal.toString(16) para obter o valor hexadecimal.
No entanto, acho(!) que o resultado intermediário é muito grande para caber em um inteiro normal.

2 curtidas

Obrigado pela dica, Richard, mas não estou avançando nem com essa ideia.

Não sei se não seria um bom recurso ter uma configuração do tipo “Habilitar links de upload absolutos em visualizações brutas (rotas)”. Eu usaria isso totalmente no nosso caso - porque, pelo que entendi, o encurtamento de URL de upload é realmente apenas uma otimização do Discourse para reduzir o código, certo? Não está relacionado ao Markdown.

Alguém da equipe do discourse pode fornecer um método JS que restaure o URL absoluto?
Isso seria útil para a comunidade, pensem.

Eu não consigo fazer isso ;(

@RGJ você conhece alguém da equipe do Discourse que possa fornecer essa função auxiliar?

Não…
Sugiro que você poste isso em Marketplace.

1 curtida

Você poderia falar mais sobre seu caso de uso. Talvez esta não seja a melhor solução.

Você pode converter de base62 para hex, mas nunca será capaz de reconstruir totalmente a URL de upload sem algum tipo de interface para o banco de dados do Discourse. O caminho completo para um upload depende do id do upload, que não pode ser determinado a partir da URL curta.

Como o @pfaffman disse, podemos ajudar mais se você descrever seu caso de uso.

4 curtidas