App.go
package main
import (
"./zip"
"flag"
"fmt"
"io"
"log"
"net/http"
"os"
)
var (
dir = flag.String("d", "./temp/", "location dir")
addr = flag.String("b", "0.0.0.0:8090", "http listen port")
)
func main() {
flag.Parse()
log.Println("绑定" + *addr)
log.Println("存储地址" + *dir)
http.HandleFunc("/upload", upload)
http.ListenAndServe(*addr, nil)
}
func upload(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
fmt.Fprintln(w, "滚")
return
}
err := r.ParseMultipartForm(1024 * 1024 * 100)
if err != nil {
fmt.Fprintln(w, err)
return
}
file, handler, err := r.FormFile("uploadfile")
defer file.Close()
if err != nil {
fmt.Fprintln(w, err)
return
}
os.Mkdir(*dir, 0777)
log.Println(handler.Filename)
f, err := os.OpenFile(*dir+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
defer f.Close()
if err != nil {
fmt.Fprintln(w, err)
return
}
io.Copy(f, file)
err = ziputil.DeCompress(f.Name(), *dir)
if err != nil {
fmt.Fprintln(w, err)
return
}
os.Remove(f.Name())
fmt.Fprintln(w, "upload ok!")
}
zip/ziputil.go
package ziputil
import (
"archive/zip"
"io/ioutil"
"log"
"os"
"strings"
)
func DeCompress(tarFile, dest string) error {
if strings.HasSuffix(tarFile, ".zip") {
return zipDeCompress(tarFile, dest)
}
return nil
}
func zipDeCompress(zipFile, dest string) error {
or, err := zip.OpenReader(zipFile);
defer or.Close()
if err != nil {
return err
}
log.Print(" 压缩文件", zipFile, " 解压到", dest)
for _, item := range or.File {
if item.FileInfo().IsDir() {
os.Mkdir(dest+item.Name, 0777);
continue
}
rc, _ := item.Open()
dst, _ := createFile(dest + item.Name);
payload, err := ioutil.ReadAll(rc)
n, err := dst.Write(payload)
if err != nil {
log.Print(dest + item.Name)
log.Print(err)
} else {
log.Print(n/1024, "kb"," ",dest + item.Name)
}
}
return nil
}
func createFile(name string) (*os.File, error) {
err := os.MkdirAll(string([]rune(name)[0:strings.LastIndex(name, "/")]), 0755)
if err != nil {
return nil, err
}
return os.Create(name)
}