Files
gotenberg/app/handlers/converter/converter.go
2018-03-30 09:28:29 +02:00

114 lines
2.0 KiB
Go

package converter
import (
"fmt"
"net/http"
"os"
gfile "github.com/gulien/gotenberg/app/handlers/converter/file"
"github.com/gulien/gotenberg/app/handlers/converter/process"
ghttp "github.com/gulien/gotenberg/app/handlers/http"
"github.com/satori/go.uuid"
)
type Converter struct {
files []*gfile.File
workingDir string
}
type NoFileToConvertError struct{}
func (e *NoFileToConvertError) Error() string {
return "There is no file to convert"
}
func NewConverter(r *http.Request, contentType ghttp.ContentType) (*Converter, error) {
c := &Converter{
workingDir: fmt.Sprintf("./%s/", uuid.NewV4().String()),
}
if err := os.Mkdir(c.workingDir, 0666); err != nil {
return nil, err
}
switch contentType {
case ghttp.MultipartFormDataContentType:
err := r.ParseMultipartForm(32 << 20)
if err != nil {
return nil, err
}
formData := r.MultipartForm
files, ok := formData.File["files"]
if !ok {
return nil, nil
}
for i := range files {
file, err := files[i].Open()
if err != nil {
return nil, err
}
defer file.Close()
f, err := gfile.NewFile(c.workingDir, file)
if err != nil {
return nil, err
}
c.files = append(c.files, f)
}
break
default:
f, err := gfile.NewFile(c.workingDir, r.Body)
if err != nil {
return nil, err
}
c.files = append(c.files, f)
}
if len(c.files) == 0 {
return nil, &NoFileToConvertError{}
}
return c, nil
}
func (c *Converter) Convert() (string, error) {
var filesPaths []string
for _, f := range c.files {
if f.Type != gfile.PDFType {
path, err := process.ExecConversion(c.workingDir, f)
if err != nil {
return "", err
}
filesPaths = append(filesPaths, path)
} else {
filesPaths = append(filesPaths, f.Path)
}
}
if len(filesPaths) == 1 {
return filesPaths[0], nil
}
path, err := process.ExecMerge(c.workingDir, filesPaths)
if err != nil {
return "", err
}
return path, nil
}
func (c *Converter) Clear() error {
if err := os.RemoveAll(c.workingDir); err != nil {
return err
}
return nil
}