Zákazník webovej aplikácie napísanej v Go mal niekoľko stoviek wordowských dokumentov, v ktorých mal data, ktoré chcel naimportovať do aplikácie. Táto úloha sa dá vyriešiť priamo v Go.
Dokument vo Worde (.docx) je v podstate zip súboro, ktorý obsahuje niekoľko xml dokumentov. Samotné dáta dokumentu sú uložené v document.xml. Pretože sa jedná o upload súboru, tak je vhodné riešenie to urobiť celé v pamäti a neukladať súbor zbytočne do temporary súboru.
Riešenie je v princípe jednoduché - tu je zjednodušený kód:
// c: controller z frameworku BeeGo má funkciu GetFile
// ktorá vracia https://golang.org/pkg/mime/multipart/#File
docx, fileHeader, err := c.GetFile("file")
if !strings.HasSuffix(fileHeader.Filename, "docx") {
//ak nie je docx súbor tak sa ďalej nepokračuje
}
//rozzipovanie súboru
buf := new(bytes.Buffer)
fileSize, err := io.Copy(buf, docx)
if err != nil {
return
}
r, err := zip.NewReader(bytes.NewReader(buf.Bytes()), fileSize)
if err != nil {
return
}
//prehľadávanie rozzipovaného súboru a hľadanie document.xml
for _, f := range r.File {
if f.Name == "word/document.xml" {
xmlFile, err := f.Open()
if err != nil {
log.Fatal(err)
}
parser := xml.NewDecoder(xmlFile) //parsovanie xml súboru
.
.
.
Pôvodne som si myslel, že to v Go nezvládnem a budem musieť použiť nejakú knižnicu v inom jazyku. Ukázalo sa, že je to nielen možné, ale aj jednoduché. Navyše je to aj rýchle riešenie. Neskôr sme spracovávali všetky súbory naraz a 400 Word dokumentov bolo spracovaných a uložených do databázy za 20 sekúnd.