simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Goでローカルファイルにテキストファイルを書き出す

■前置き
WebページをユーザのクライアントマシンからWebブラウザで見てもらい
ユーザアクティビティを短い文字列情報でPOSTしてもらうことで、ユーザ端末で何が起きたのかを収集します。

ログを出すだけじゃ意味がなく、受け取った情報をファイルに保存しなければなりません。
POSTメッセージを捌く go の HTTP サーバを別ポートで起動し、疎通確認を行ったのが前回
今回は、受け取ったメッセージをファイルに保存してみせます。

■調査
go でファイルを操作する時にimport するパッケージは?
osパッケージを利用するのが基本とのことです。
参考
ファイル入出力 - はじめてのGo言語

前回からの差分としては以下のコードを追加しました

import (
	"os"
)

	file, err := os.Create("osfile.txt")
	if err != nil {
		fmt.Printf("os.Open err = %v\n", err)
		return
	}
	defer file.Close()
	output := fmt.Sprintf("%v", form)
	file.Write(([]byte)(output))

HTTPメッセージPOSTを受け取ったらそのままファイル出力するだけのコードは以下の通り(動作確認済み)
送られてくるたびにファイル名が書き換わる便利機能を追加しておきました。

package main

import (
	"fmt"
	"net/http"
	"os"
	"time"
)

func apiname1(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		fmt.Fprintf(w, "this is apiname1")
		return
	}
	w.Header().Set("Content-Type", "text/plain")
	r.ParseForm()
	form := r.PostForm
	// params := r.Form

	layout := "2006_01_02_15_04_05"
	fname := time.Now().Format(layout) + ".txt"
	file, err := os.Create(fname)
	if err != nil {
		fmt.Printf("os.Open err = %v\n", err)
		return
	}
	defer file.Close()
	output := fmt.Sprintf("%v", form)
	file.Write(([]byte)(output))
}

func main() {
	http.HandleFunc("/apiname1", apiname1)
	http.ListenAndServe(":8080", nil)
}

日付のフォーマットがなかなか考えられていて、こういう風に書きたいってレイアウトを書くとその通りに出してくれる。
それぞれの数字がユニークで、時間や分を意味している。
一覧はここで確認する。

クライアントのブラウザの操作から Webサーバ側でファイルを書き出せたのでよしとします。
なお、出力フォルダは go プログラムをルートとしたところから指定できました。