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 إعجابات

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 إعجابات

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)

مثير للاهتمام. لا يمكنني تكرار هذا باستخدام جافاسكريبت. لأن طريقتك الأخيرة هي تحويل binary2hex ولكن النتيجة من فك تشفير base62 ليست تمثيلًا ثنائيًا مما أفهمه.

من منظور جافاسكريبت، وجدت الأشياء التالية مفيدة:
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;
}

للأسف، لا تساعد طرق bin2hex ولا dec2hex، عندما أستخدم سلاسل الإدخال الخاصة بك.

لقد أنشأت صندوق رموز لهذه المشكلة إذا كان شخص ما مهتمًا باللعب بها. القيمة النهائية هي 1 لسلسلة الإدخال الخاصة بي وهو أمر خاطئ ؛ (

شكرًا

يجب أن تكون قادرًا على استخدام binVal.toString(16) للحصول على القيمة السداسية عشرية.
ومع ذلك، أعتقد (!) أن النتيجة الوسيطة كبيرة جدًا بحيث لا تتناسب مع عدد صحيح عادي.

إعجابَين (2)

شكراً على التلميح يا ريتشارد، لكنني لم أتقدم أكثر حتى مع هذه الفكرة.

لا أعرف، ألن يكون من الجيد وجود إعداد مثل “تمكين روابط التحميل المطلقة في طرق العرض الخام (المسارات)”. سأستخدم ذلك بالتأكيد في حالتنا - لأنه، حسب فهمي، فإن تقصير عنوان URL للتحميل هو مجرد تحسينات في الخطاب لتقليل التعليمات البرمجية؟ لا علاقة له بـ Markdown.

هل يمكن لأي شخص من فريق discourse تقديم طريقة JS يمكنها استعادة عنوان URL المطلق؟
سيكون ذلك مفيدًا للمجتمع، فكروا في الأمر.

أنا غير قادر على تحقيق ذلك :frowning:

@RGJ هل تعرف أي شخص في فريق Discourse لتقديم هذه الوظيفة المساعدة؟

لا…
أقترح عليك نشر هذا في Marketplace.

إعجاب واحد (1)

قد تقول المزيد عن حالة الاستخدام الخاصة بك. ربما هذا ليس أفضل حل.

لن تتمكن أبدًا من إعادة بناء عنوان URL للتحميل بالكامل دون نوع من الواجهة لقاعدة بيانات Discourse. المسار الكامل للتحميل يعتمد على id التحميل، والذي لا يمكن تحديده من عنوان URL القصير.

كما قال @pfaffman، قد نتمكن من المساعدة أكثر إذا وصفت حالة الاستخدام الخاصة بك.

4 إعجابات