こんなコードを書くとzipファイルがおかしいとなったのでメモ
target, err := ioutil.TempFile("", "zip")
if err != nil {
sentry.CaptureException(err)
log.Fatalln(err)
}
w := zip.NewWriter(target)
defer w.Close()
for _, client := range clients {
xlsx, err := run(client.ClientID)
if err != nil {
continue
}
defer xlsx.Close()
f, err := w.Create(fmt.Sprintf("%d_item_error.xlsx", client.ClientID))
if err != nil {
sentry.CaptureException(err)
log.Fatalln(err)
}
if _, err := xlsx.Seek(0, io.SeekStart); err != nil {
sentry.CaptureException(err)
log.Fatalln(err)
}
if _, err := io.Copy(f, xlsx); err != nil {
sentry.CaptureException(err)
log.Fatalln(err)
}
}
if _, err := target.Seek(0, io.SeekStart); err != nil {
sentry.CaptureException(err)
log.Fatalln(err)
}
if _, err := internal.Upload(target, "archive.zip", "application/zip"); err != nil {
sentry.CaptureException(err)
log.Fatalln(err)
}
何がやりたいかというと、xlsxファイルをクライアントで作って、それをzipにしてs3とかにアップロードしたいコード
これだと、zipが壊れてアップロードされる。
もしかしてFlashされてないのかなと思って
Seekするまに
w.Flashにしても同じ状況に
よくなかった??ので
defer w.Close()しているところみたいで、
Seekをするまにw.Close()を呼ぶべきみたいでした。
target, err := ioutil.TempFile("", "zip")
if err != nil {
sentry.CaptureException(err)
log.Print(err)
goto exits
}
w := zip.NewWriter(target)
for _, client := range clients {
xlsx, err := run(client.ClientID)
if err != nil {
continue
}
defer xlsx.Close()
f, err := w.Create(fmt.Sprintf("%d_item_error.xlsx", client.ClientID))
if err != nil {
sentry.CaptureException(err)
log.Print(err)
goto exits
}
if _, err := xlsx.Seek(0, io.SeekStart); err != nil {
sentry.CaptureException(err)
log.Print(err)
goto exits
}
if _, err := io.Copy(f, xlsx); err != nil {
sentry.CaptureException(err)
log.Print(err)
goto exits
}
}
w.Close()
if _, err := target.Seek(0, io.SeekStart); err != nil {
sentry.CaptureException(err)
log.Print(err)
goto exits
}
if _, err := internal.Upload(target, "archive.zip", "application/zip"); err != nil {
sentry.CaptureException(err)
log.Print(err)
goto exits
}
とりあえず、deferしてCloseすればいいではなく理解しないとなという。
goto exitsもlog.Fatalでos.Exitになってdeferを呼ばれなくなるので
こうしているどうするのがいいのか。。
Flashは非推奨となっているけど、Flashしても壊れるのもよくわからない感じで。