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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

Interessant. Ich kann dies mit Javascript nicht reproduzieren. Da Ihre letzte Methode eine bin2hex-Konvertierung ist, ist das Ergebnis der Base62-Dekodierung meines Verständnisses nach keine binäre Darstellung.

Aus JS-Sicht fand ich Folgendes hilfreich:
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;
}

Leider helfen weder die bin2hex- noch die dec2hex-Methoden, wenn ich Ihre Eingabezeichenfolgen verwende.

Ich habe für dieses Problem einen Codesandbox erstellt, falls jemand daran interessiert ist, damit herumzuspielen. Der endgültige Wert ist 1 für meine Eingabezeichenfolge, was falsch ist ; (

Danke

Sie sollten binVal.toString(16) verwenden können, um den Hexadezimalwert zu erhalten.
Ich glaube jedoch (!), dass das Zwischenergebnis zu groß ist, um in eine normale Ganzzahl zu passen.

2 „Gefällt mir“

Danke für den Hinweis, Richard, aber ich komme auch mit dieser Idee nicht weiter.

Ich weiß nicht, wäre es nicht eine gute Funktion, eine Einstellung wie „Absolute Upload-Links in Rohansichten (Routen) aktivieren“ zu haben? Ich würde das in unserem Fall auf jeden Fall nutzen – denn meines Verständnisses nach ist die Verkürzung von Upload-URLs wirklich nur eine Discourse-Optimierung, um Code zu reduzieren, oder? Sie hat nichts mit Markdown zu tun.

Kann jemand aus dem Discourse-Team eine JS-Methode bereitstellen, die die absolute URL wiederherstellen kann?
Das wäre hilfreich für die Community, denkt nach.

Ich schaffe das nicht ;(

@RGJ kennst du jemanden im Discourse-Team, der diese Hilfsfunktion bereitstellen kann?

Nein…
Ich würde vorschlagen, dass du das in Marketplace postest.

1 „Gefällt mir“

Sie könnten mehr über Ihren Anwendungsfall sagen. Vielleicht ist dies nicht die beste Lösung.

Sie können von Base62 in Hex umwandeln, aber Sie werden die Upload-URL niemals vollständig rekonstruieren können, ohne eine Art Schnittstelle zur Discourse-Datenbank. Der vollständige Pfad zu einem Upload hängt von der id des Uploads ab, die nicht aus der Kurz-URL ermittelt werden kann.\n\nWie @pfaffman sagte, könnten wir Ihnen vielleicht besser helfen, wenn Sie Ihren Anwendungsfall beschreiben.

4 „Gefällt mir“