This commit is contained in:
parent
5a9fa25702
commit
bdfba6c96d
|
@ -0,0 +1,50 @@
|
||||||
|
package file
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/b3log/wide/util"
|
||||||
|
"github.com/golang/glog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CreateZip handles request of creating zip.
|
||||||
|
func CreateZip(w http.ResponseWriter, r *http.Request) {
|
||||||
|
data := map[string]interface{}{"succ": true}
|
||||||
|
defer util.RetJSON(w, r, data)
|
||||||
|
|
||||||
|
var args map[string]interface{}
|
||||||
|
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&args); err != nil {
|
||||||
|
glog.Error(err)
|
||||||
|
data["succ"] = false
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
path := args["path"].(string)
|
||||||
|
base := filepath.Base(path)
|
||||||
|
|
||||||
|
if !util.File.IsExist(path) {
|
||||||
|
data["succ"] = false
|
||||||
|
data["msg"] = "Can't find file [" + path + "]"
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
zipFile, err := util.Zip.Create(path + ".zip")
|
||||||
|
if nil != err {
|
||||||
|
glog.Error(err)
|
||||||
|
data["succ"] = false
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer zipFile.Close()
|
||||||
|
|
||||||
|
if util.File.IsDir(path) {
|
||||||
|
zipFile.AddDirectory(base, path)
|
||||||
|
} else {
|
||||||
|
zipFile.AddEntry(base, path)
|
||||||
|
}
|
||||||
|
}
|
3
main.go
3
main.go
|
@ -281,6 +281,9 @@ func main() {
|
||||||
http.HandleFunc("/file/search/text", handlerWrapper(file.SearchText))
|
http.HandleFunc("/file/search/text", handlerWrapper(file.SearchText))
|
||||||
http.HandleFunc("/file/find/name", handlerWrapper(file.Find))
|
http.HandleFunc("/file/find/name", handlerWrapper(file.Find))
|
||||||
|
|
||||||
|
// file export/import
|
||||||
|
http.HandleFunc("/file/zip", handlerWrapper(file.CreateZip))
|
||||||
|
|
||||||
// editor
|
// editor
|
||||||
http.HandleFunc("/editor/ws", handlerWrapper(editor.WSHandler))
|
http.HandleFunc("/editor/ws", handlerWrapper(editor.WSHandler))
|
||||||
http.HandleFunc("/go/fmt", handlerWrapper(editor.GoFmtHandler))
|
http.HandleFunc("/go/fmt", handlerWrapper(editor.GoFmtHandler))
|
||||||
|
|
|
@ -0,0 +1,104 @@
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/zip"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
type myzip struct{}
|
||||||
|
|
||||||
|
// Zip utilities.
|
||||||
|
var Zip = myzip{}
|
||||||
|
|
||||||
|
type ZipFile struct {
|
||||||
|
zipFile *os.File
|
||||||
|
writer *zip.Writer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*myzip) Create(filename string) (*ZipFile, error) {
|
||||||
|
file, err := os.Create(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &ZipFile{zipFile: file, writer: zip.NewWriter(file)}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z *ZipFile) Close() error {
|
||||||
|
err := z.zipFile.Close() // close the underlying writer
|
||||||
|
if nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return z.writer.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z *ZipFile) AddEntryN(dir string, names ...string) error {
|
||||||
|
for _, name := range names {
|
||||||
|
zipPath := filepath.Join(dir, name)
|
||||||
|
err := z.AddEntry(zipPath, name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z *ZipFile) AddEntry(dir, name string) error {
|
||||||
|
entry, err := z.writer.Create(dir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := os.Open(name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
_, err = io.Copy(entry, file)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z *ZipFile) AddDirectoryN(dir string, names ...string) error {
|
||||||
|
for _, name := range names {
|
||||||
|
err := z.AddDirectory(dir, name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z *ZipFile) AddDirectory(dir, dirName string) error {
|
||||||
|
files, err := ioutil.ReadDir(dirName)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range files {
|
||||||
|
localPath := filepath.Join(dirName, file.Name())
|
||||||
|
zipPath := filepath.Join(dir, file.Name())
|
||||||
|
|
||||||
|
err = nil
|
||||||
|
if file.IsDir() {
|
||||||
|
z.AddEntry(dir, dirName)
|
||||||
|
|
||||||
|
err = z.AddDirectory(zipPath, localPath)
|
||||||
|
} else {
|
||||||
|
err = z.AddEntry(zipPath, localPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue