0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

アスキーアート総合Advent Calendar 2018

Day 12

URLにTXTの情報を詰めてみる

Posted at

下の記事でも紹介していますが、以前URLを使ってストレージいらずのテキスト共有のサービスを作ったことがあります。
Ionicによるプライベートプロダクト開発の裏側事情
Screen Shot 2018-12-22 at 23.24.43.png

その時の内容はURLにテキストの情報を全て入れ込むというなかなかの力技だったんですが、半年以上たってその時の処理を忘れないように備忘録として書き残しておきます。

処理の手順

GolangのBase64エンコーディングにはなんとURLEncodingというものがあります。

base64.NewEncoder(base64.URLEncoding, &buf64)

こいつを使えばURLセーフなBase64エンコーディングを行うことができます。さらにGolangには標準でgzipのライブラリがあります。なので、これらを組み合わせて以下のようなことが行えます。

  1. テキストをプログラムで受け取る
  2. テキストをgzipで圧縮する
  3. URLセーフでBase64エンコーディングする
  4. URLのパラメータにする

上記を実装するために以下、Golangでテキスト→gzip→Base64のソースコードになります。

package main

import (
	"bytes"
	"compress/gzip"
	"encoding/base64"
	"fmt"
	"io/ioutil"
	"strings"
)

func main() {
	text := `
          ///////////////////////// ------\/////////ヽ
       ////:///////////////>  "´        ∨////////∧
      .///////////////> ´                ∨////////∧
     ///////////> ´                   ∨////////∧
     |///////,〃/                       i//////////ハ
     |////////i/            _  --――― 、--}//////////∧
     |////////|            ´    ト.     ヽ \'/////////∧
     |////////|      ..  イ        i \   ノ  ', \////////∧
     |////////|   .   ´i   i         ー|-- 斗、.    ',  \///////∧
     |////////| /    |  ハ    ',  ∧! ,ィf=ミ、   ',ー― ///////∧
     |////////|'   .、_|..斗七ヽト、   ヽ| u   {::♥::} ゞ \ ',i///////////,∧
     |////////|      |/i/,.ィf=ミ ヽト、!|   `¨¨¨´/  /\!.マニ ア//////,∧
     |////////ハ     / .ィ f:::♥ノ   | / ///// / i  |=イ/////////∧
     |////////,∧    /{ ゞ `¨´ /, j/ /// ./イ /  .|  i  i///////////
     |/////////|.ヘ  / 乂 /////      u /   |  |  i!///////////
     |/////////>j/   \          _   j/|  .| ∧!  !///////////
     |/////// ∠ィ ヘ     >_      ,ィv´  _)  / |  |/:::::∧ .|V//////////
     |//////ゝ---一 ヘ  ゝ----' u   ゝ- ´    /i .|  |:::::::::::∧!::∨/////////
     |//////////| i ∧    ',≧=-   __ .イ !ハ  |:::::::::::::_:::乂////////
     |//////////| ∧ ∧   ト{    }    i    {ーヘ !´ ̄ / アニ≧= ---
     |//////////|/::::ヘ.  ',   |从 __ノi    ',   ノ  ヘ|  / /ニニニニニニ
     |//////////|:::::::::::\{ヘ  .|-<   ゝ    r 、 -、     /  /ニニニニニニニ
     |/////////ノ==-<   ', |         r'   く      ./ニニニニニニニニ
     .ノ//>≦ニニニニニ\  }/          ` ´ \\    /ニニニニニニニニ
    .///ニニニニニニニニニ\              `´    {ニニニニニニニニニ
    .イニニニニニニニニニニニヽ                  /ニニニニニニニニニ
	`
	if b64, err := EncodeEncodeBase64Base64(text); err != nil {
		fmt.Println("err:", err)
	} else {
		fmt.Println(b64)
		if aa, err := DecodeBase64Gzip(b64); err != nil {
			fmt.Println("err:", err)
		} else {
			fmt.Println(string(aa))
		}
	}

}

func EncodeEncodeBase64Base64(str string) (string, error) {
	var buf64 bytes.Buffer
	wb64 := base64.NewEncoder(base64.URLEncoding, &buf64)
	wgz := gzip.NewWriter(wb64)
	_, err := wgz.Write([]byte(str))
	if err != nil {
		return "", err
	}
	wgz.Close()
	wb64.Close()
	sRequest64 := string(buf64.Bytes())
	return sRequest64, nil
}

func DecodeBase64Gzip(b64 string) ([]byte, error) {
	if r, err := gzip.NewReader(base64.NewDecoder(base64.URLEncoding, strings.NewReader(b64))); err != nil {
		fmt.Println(err)
		return nil, err
	} else {

		if s, err := ioutil.ReadAll(r); err != nil {
			fmt.Println(err)
			return nil, err
		} else {
			return s, nil
		}
	}
}

まとめ

上記ソースコードを使えば好きなテキストをURLに埋め込むことが可能です。また、別記事にて上記ソースコードを利用してWebアプリ側でテキストを表示する処理を記載します

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?