Conversione di brevi URL di upload in URL completi

Potrei star cercando nel posto sbagliato, quindi mi scuso se è così, ma qualsiasi indicazione è molto gradita!

Nel nostro sito Discourse ci sono alcuni thread che vengono visualizzati in parte anche sul nostro sito principale. Poiché la versione “cotta” di un post contiene tutto l’HTML per il lightbox, che non vogliamo mostrare sul sito principale, sto lavorando con la versione grezza del post.

Una cosa che mi sta creando problemi sono gli URL dei file caricati. Come posso convertire un URL upload:// in un URL completo? Ho cercato e ho trovato riferimenti a SHA1 e Base62, ma a parte quello, non importa cosa provi, non riesco a ottenere l’URL completo.

Come ho detto, potrei star guardando dalla parte sbagliata, oppure (probabilmente) esiste un modo più semplice per fare queste cose, quindi qualsiasi consiglio è benvenuto!

Grazie in anticipo

Decodifica prima in base62 utilizzando il set di caratteri invertito, quindi codifica in esadecimale il risultato.

In codice Python appare così:

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

Grazie per la risposta rapida @michaeld. Ci proverò più tardi oggi :slight_smile:


Per chiunque fosse interessato e volesse farlo in PHP, ho utilizzato una libreria Composer chiamata base62 by tuupola.

Questo è il codice che ho usato:

<?php

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

/** Imposta il nome del file originale, escludendo eventuali estensioni */
$s = "r3AYqESanERjladb4vBB7VsMBm6";

/** Decodifica, converti in esadecimale */
$decoded = $base62->decode($s);

/** Risultato atteso: bda2c513e1da04f7b4e99230851ea2aafeb8cc4e */
echo bin2hex($decoded);

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.

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.

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.