Skip to content

Commit

Permalink
add archive upload
Browse files Browse the repository at this point in the history
  • Loading branch information
JojiiOfficial committed Jun 10, 2020
1 parent fac2f36 commit b638764
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 1 deletion.
37 changes: 37 additions & 0 deletions FileUpload.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import (
"mime/multipart"
"net/url"
"os"

"github.com/JojiiOfficial/gaw"
)

// NoProxyWriter use to fill proxyWriter arg in UpdloadFile
Expand Down Expand Up @@ -41,6 +43,9 @@ type UploadRequest struct {
Buffersize int
fileSizeCallback FileSizeCallback
ProxyWriter WriterProxy
NoCompress bool

compress bool // Only folders are affected by compressing
}

// NewUploadRequest create a new uploadrequest
Expand All @@ -56,6 +61,12 @@ func (libdm LibDM) NewUploadRequest(name string, attributes FileAttributes) *Upl
}
}

// WithNoCompress don't compress uploaded folders
func (uploadRequest *UploadRequest) WithNoCompress() *UploadRequest {
uploadRequest.NoCompress = true
return uploadRequest
}

// SetFileSizeCallback sets the callback if the filesize is known
func (uploadRequest *UploadRequest) SetFileSizeCallback(cb FileSizeCallback) *UploadRequest {
uploadRequest.fileSizeCallback = cb
Expand Down Expand Up @@ -110,6 +121,7 @@ func (uploadRequest *UploadRequest) BuildRequestStruct(Type UploadType) *UploadR
Public: uploadRequest.Public,
PublicName: uploadRequest.Publicname,
ReplaceFile: uploadRequest.ReplaceFileID,
Compressed: uploadRequest.compress,
UploadType: Type,
}
}
Expand Down Expand Up @@ -167,6 +179,31 @@ func (uploadRequest *UploadRequest) UploadFile(f *os.File, uploadDone chan strin
return uploadRequest.UploadFromReader(f, fi.Size(), uploadDone, cancel)
}

// UploadCompressedFolder uploads the given folder to the server
func (uploadRequest *UploadRequest) UploadCompressedFolder(uri string, uploadDone chan string, cancel chan bool) (*UploadResponse, error) {
uploadRequest.compress = true
uploadRequest.Name += ".tar"

// Use size of all files in dir as
// full upload size
size, err := gaw.GetDirSize(uri)
if err != nil {
return nil, err
}

pr, pw := io.Pipe()
defer pr.Close()

go func() {
// Compress dir
err = archive(uri, pw)
defer pw.Close()
}()

// Upload from compress reader
return uploadRequest.UploadFromReader(pr, size, uploadDone, cancel)
}

// Do does the final upload http request and uploads the src
func (uploadRequest *UploadRequest) Do(body io.Reader, payload interface{}, contentType ContentType) (*UploadResponse, error) {
// Make json header content
Expand Down
1 change: 1 addition & 0 deletions Requests.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ type UploadRequestStruct struct {
Attributes FileAttributes `json:"attr,omitempty"`
Encryption string `json:"e,omitempty"`
ReplaceFile uint `json:"r,omitempty"`
Compressed bool `json:"compr,omitempty"`
Size int64 `json:"s"`
}

Expand Down
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@ module github.com/DataManager-Go/libdatamanager

go 1.14

require github.com/jinzhu/gorm v1.9.12
require (
github.com/JojiiOfficial/gaw v1.2.5
github.com/jinzhu/gorm v1.9.12
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
github.com/JojiiOfficial/gaw v1.2.5 h1:wbguzCqNaCBMYH1a9D6EHW2aIG21uo6CS6qaHLi5I3s=
github.com/JojiiOfficial/gaw v1.2.5/go.mod h1:Y0hrpN0iX0L5bBf/8+kIER7R/m4GTNuKkifXisMG4S4=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y=
Expand Down
63 changes: 63 additions & 0 deletions utils.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package libdatamanager

import (
"archive/tar"
"encoding/base64"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)

func encodeBase64(b []byte) []byte {
Expand All @@ -18,3 +22,62 @@ func decodeBase64(b []byte) []byte {
}
return data
}

func archive(src string, buf io.Writer) error {
tw := tar.NewWriter(buf)
buff := make([]byte, 1024*1024)

baseDir := getBaseDir(src)

// walk through every file in the folder
filepath.Walk(src, func(file string, fi os.FileInfo, err error) error {
if len(file) < len(src)+1 {
return nil
}

// generate tar header
header, err := tar.FileInfoHeader(fi, file)
if err != nil {
return err
}

// must provide real name
// (see https://golang.org/src/archive/tar/common.go?#L626)
filen := file[len(src)+1:]
header.Name = filepath.ToSlash(filen)

// write header
if err := tw.WriteHeader(header); err != nil {
return err
}

// if not a dir, write file content
if !fi.IsDir() {
data, err := os.Open(file)
if err != nil {
return err
}

if _, err := io.CopyBuffer(tw, data, buff); err != nil {
return err
}
}

return nil
})

// produce tar
if err := tw.Close(); err != nil {
return err
}

return nil
}

func getBaseDir(dir string) string {
if strings.HasSuffix(dir, string(filepath.Separator)) {
dir = dir[:len(dir)-1]
}

return filepath.Dir(dir)
}

0 comments on commit b638764

Please sign in to comment.