짧은 업로드 URL을 전체 URL로 변환하기

아마도 제가 잘못된 방향으로 생각하고 있는 것 같아, 만약 그렇다면 죄송합니다. 하지만 어떤 조언도 환영합니다!

저희 Discourse 사이트의 일부 스레드가 메인 웹사이트에 부분적으로 표시됩니다. 게시물의 cooked 버전에는 라이트박스용 HTML이 모두 포함되어 있는데, 이는 메인 사이트에서 원치 않는 요소이기 때문에 저는 게시물의 raw 버전을 다루고 있습니다.

그중에서 저를 당황하게 하는 부분이 바로 파일 업로드 URL입니다. upload:// URL을 전체 URL로 변환하는 방법이 있을까요? 검색을 해보았는데 SHA1과 Base62에 대한 언급은 봤지만, 그 외에는 어떤 방법을 시도해도 전체 URL을 얻지 못했습니다.

말씀드린 것처럼 제가 잘못된 부분을 보고 있을 수도 있고, 더 쉬운 방법이 있을 수도 있으니 조언을 주시면 감사하겠습니다.

미리 감사합니다

먼저 반전된 문자 세트를 사용하여 base62 디코딩을 수행한 후, 결과를 hex 인코딩합니다.

Python 코드로는 다음과 같습니다:

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

빠른 답변 감사합니다 @michaeld. 오늘 늦게 시도해볼게요 :slight_smile:


PHP로 이 작업을 수행하는 데 관심이 있는 분들을 위해, tuupola의 base62라는 composer 라이브러리를 사용했습니다.

사용한 코드는 다음과 같습니다:

<?php

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

/** 파일 확장자를 제외한 원래 파일 이름 설정 */
$s = "r3AYqESanERjladb4vBB7VsMBm6";

/** 디코딩, 16진수로 변환 */
$decoded = $base62->decode($s);

/** 예상 결과: bda2c513e1da04f7b4e99230851ea2aafeb8cc4e */
echo bin2hex($decoded);

흥미롭네요. 제 경우엔 JavaScript로 이 문제를 재현할 수 없었습니다. 마지막 메서드는 binary2hex 변환인데, 제가 이해한 바로는 base64 디코딩 결과는 바이너리 표현이 아니기 때문입니다.

JavaScript 관점에서 다음 자료들이 도움이 되었습니다:
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 메서드도 도움이 되지 않았습니다.

관심 있는 분들을 위해 해당 문제에 대한 codesandbox를 만들었습니다. 제 입력 문자열에 대한 최종 값은 1인데, 이는 잘못된 결과입니다 ;(

https://codesandbox.io/s/kind-hypatia-dp5vh0?file=/src/index.js

감사합니다.

binVal.toString(16)을 호출하면 16진수 값을 얻을 수 있어야 합니다.
하지만(!) 중간 결과가 너무 커서 일반 정수 범위에 맞지 않는다고 생각합니다.

힌트를 주셔서 감사합니다, Richard. 하지만 그 아이디어를 적용해도 더 이상 진행이 되지 않습니다.

“Enable absolute upload links in raw views (routes)”(원시 뷰(라우트)에서 절대 업로드 링크 활성화)와 같은 설정을 추가하는 것이 좋은 기능이라고 생각되지 않을까요? 저희 경우에는 이를 적극 활용할 것입니다. 제 이해로는 업로드 URL 단축은 코드를 줄이기 위한 Discourse의 최적화 기능일 뿐이며, 마크다운과는 무관한 것 같습니다.

discourse 팀에서 절대 URL을 복원할 수 있는 JS 메서드를 제공해 주실 수 있을까요?
그렇게 하면 커뮤니티에 도움이 될 것 같습니다.

제가 직접 해결하지 못하겠네요 ;(

@RGJ 디스코urse 팀에서 그 헬퍼 함수를 제공할 수 있는 사람을 아시나요?

아니요…
이것은 Marketplace 채널에 게시하는 것을 권장합니다.

사용 사례에 대해 더 자세히 말씀해 주실 수 있습니다. 아마도 이것이 최선의 해결책은 아닐 수도 있습니다.

base62에서 hex로 변환할 수는 있지만, Discourse 데이터베이스에 대한 어떤 형태의 인터페이스가 없으면 업로드 URL을 완전히 재구성할 수 없습니다. 업로드의 전체 경로는 업로드의 id에 의존하며, 이는 짧은 URL에서 결정할 수 없습니다.

@pfaffman님이 말씀하신 대로, 사용 사례를 설명해 주시면 더 많은 도움을 드릴 수 있을 것입니다.