This commit is contained in:
Liang Ding 2014-11-24 17:20:43 +08:00
parent 26823c4cb9
commit 62947f4501
9 changed files with 82 additions and 20 deletions

View File

@ -3,6 +3,7 @@ package file
import (
"encoding/json"
"net/http"
"os"
"path/filepath"
"github.com/b3log/wide/util"
@ -26,8 +27,13 @@ func GetZip(w http.ResponseWriter, r *http.Request) {
return
}
filename := filepath.Base(path)
w.Header().Set("Content-Disposition", "attachment; filename="+filename)
w.Header().Set("Content-type", "application/zip")
http.ServeFile(w, r, path)
os.Remove(path)
}
// CreateZip handles request of creating zip.

View File

@ -133,5 +133,6 @@
"go_format": "Go Format",
"locale": "Locale",
"apply": "Apply",
"clearOutput": "Clear Output"
"clearOutput": "Clear Output",
"export": "Export"
}

View File

@ -133,5 +133,6 @@
"go_format": "Go フォーマット",
"locale": "ロケール",
"apply": "適用する",
"clearOutput": "空の出力"
"clearOutput": "空の出力",
"export": "輸出"
}

View File

@ -133,5 +133,6 @@
"go_format": "Go 格式化",
"locale": "语言环境",
"apply": "应用",
"clearOutput": "清空输出"
"clearOutput": "清空输出",
"export": "导出"
}

View File

@ -133,5 +133,6 @@
"go_format": "Go 格式化",
"locale": "語言環境",
"apply": "應用",
"clearOutput": "清空輸出"
"clearOutput": "清空輸出",
"export": "導出"
}

View File

@ -150,6 +150,35 @@ var tree = {
$("#fileRMenu").hide();
$("#dialogRenamePrompt").dialog("open");
},
export: function (it) {
if (it) {
if ($(it).hasClass("disabled")) {
return false;
}
}
var request = newWideRequest();
request.path = wide.curNode.path;
$.ajax({
type: 'POST',
url: '/file/zip/new',
data: JSON.stringify(request),
dataType: "json",
success: function (data) {
if (!data.succ) {
$("#dialogAlert").dialog("open", data.msg);
return false;
}
window.open('/file/zip?path=' + wide.curNode.path + '.zip');
}
});
$("#dirRMenu").hide();
$("#fileRMenu").hide();
},
init: function () {
$("#file").click(function () {
$(this).focus();
@ -289,7 +318,7 @@ var tree = {
var w = window.open(data.path);
return false;
}
if (!tempCursor) {
tempCursor = CodeMirror.Pos(0, 0);
}

View File

@ -1,6 +1,7 @@
package util
import (
"path/filepath"
"path"
"runtime"
"strings"
@ -21,7 +22,7 @@ func (*mygo) GetAPIPath() string {
ret = runtime.GOROOT() + "/src" // Go 1.4 and after
}
return path.Clean(ret)
return filepath.FromSlash(path.Clean(ret))
}
// IsAPI determines whether the specified path belongs to Go API.

View File

@ -28,32 +28,52 @@ func (*myzip) Create(filename string) (*ZipFile, error) {
}
func (z *ZipFile) Close() error {
err := z.zipFile.Close() // close the underlying writer
err := z.writer.Close()
if nil != err {
return err
}
return z.writer.Close()
return z.zipFile.Close() // close the underlying writer
}
func (z *ZipFile) AddEntryN(dir string, names ...string) error {
func (z *ZipFile) AddEntryN(path string, names ...string) error {
for _, name := range names {
zipPath := filepath.Join(dir, name)
zipPath := filepath.Join(path, 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)
func (z *ZipFile) AddEntry(path, name string) error {
fi, err := os.Stat(name)
if err != nil {
return err
}
fh, err := zip.FileInfoHeader(fi)
if err != nil {
return err
}
fh.Name = filepath.ToSlash(filepath.Clean(path))
fh.Method = zip.Deflate // data compression algorithm
if fi.IsDir() {
fh.Name = fh.Name + "/" // be care the ending separator
}
entry, err := z.writer.CreateHeader(fh)
if err != nil {
return err
}
if fi.IsDir() {
return nil
}
file, err := os.Open(name)
if err != nil {
return err
@ -65,18 +85,17 @@ func (z *ZipFile) AddEntry(dir, name string) error {
return err
}
func (z *ZipFile) AddDirectoryN(dir string, names ...string) error {
func (z *ZipFile) AddDirectoryN(path string, names ...string) error {
for _, name := range names {
err := z.AddDirectory(dir, name)
err := z.AddDirectory(path, name)
if err != nil {
return err
}
}
return nil
}
func (z *ZipFile) AddDirectory(dir, dirName string) error {
func (z *ZipFile) AddDirectory(path, dirName string) error {
files, err := ioutil.ReadDir(dirName)
if err != nil {
return err
@ -84,17 +103,16 @@ func (z *ZipFile) AddDirectory(dir, dirName string) error {
for _, file := range files {
localPath := filepath.Join(dirName, file.Name())
zipPath := filepath.Join(dir, file.Name())
zipPath := filepath.Join(path, file.Name())
err = nil
if file.IsDir() {
z.AddEntry(dir, dirName)
z.AddEntry(path, dirName)
err = z.AddDirectory(zipPath, localPath)
} else {
err = z.AddEntry(zipPath, localPath)
}
if err != nil {
return err
}

View File

@ -138,6 +138,8 @@
<li class="create" onclick="tree.newDir(this);">{{.i18n.create_dir}}</li>
<li class="remove" onclick="tree.removeIt(this);">{{.i18n.delete}}</li>
<li class="rename" onclick="tree.rename(this);">{{.i18n.rename}}</li>
<li class="hr"></li>
<li class="export" onclick="tree.export(this);">{{.i18n.export}}</li>
</ul>
</div>
@ -146,6 +148,8 @@
<ul>
<li class="remove" onclick="tree.removeIt(this);">{{.i18n.delete}}</li>
<li class="rename" onclick="tree.rename(this);">{{.i18n.rename}}</li>
<li class="hr"></li>
<li class="export" onclick="tree.export(this);">{{.i18n.export}}</li>
</ul>
</div>
</div>