|
|
|
|
|
package controllers
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"bufio"
|
|
|
|
|
|
"crypto/md5"
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"goftp/service"
|
|
|
|
|
|
"goftp/utils"
|
|
|
|
|
|
"io"
|
|
|
|
|
|
"math/rand"
|
|
|
|
|
|
"net/http"
|
|
|
|
|
|
"os"
|
|
|
|
|
|
"path"
|
|
|
|
|
|
"path/filepath"
|
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/astaxie/beego"
|
|
|
|
|
|
"github.com/astaxie/beego/logs"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type FileOptUploadController struct {
|
|
|
|
|
|
beego.Controller
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// @Title Get
|
|
|
|
|
|
// @Description 上传文件
|
|
|
|
|
|
// @router / [get]
|
|
|
|
|
|
func (c *FileOptUploadController) Get() {
|
|
|
|
|
|
c.TplName = "fileopt.html"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// @Title FileUploadPost
|
|
|
|
|
|
// @Description 上传文件
|
|
|
|
|
|
// @router /fileUploadPost [post]
|
|
|
|
|
|
func (c *FileOptUploadController) FileUploadPost() {
|
|
|
|
|
|
f, h, _ := c.GetFile("file") //获取上传的文件
|
|
|
|
|
|
ext := path.Ext(h.Filename)
|
|
|
|
|
|
//创建目录
|
|
|
|
|
|
goftpdir := beego.AppConfig.String("macgoftpdir")
|
|
|
|
|
|
servergoftpdir := beego.AppConfig.String("servergoftpdir")
|
|
|
|
|
|
if utils.ValiteDirExist(servergoftpdir) == true {
|
|
|
|
|
|
goftpdir = servergoftpdir
|
|
|
|
|
|
}
|
|
|
|
|
|
uploadDir := utils.CreateBaseDir(goftpdir)
|
|
|
|
|
|
//uploadDir := utils.CreateBaseDir("/Users/edao/goftpdir");
|
|
|
|
|
|
//uploadDir := "/root/goftpdir"
|
|
|
|
|
|
//构造文件名称
|
|
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
|
|
randNum := fmt.Sprintf("%d", rand.Intn(9999)+1000)
|
|
|
|
|
|
hashName := md5.Sum([]byte(time.Now().Format("2006_01_02_15_04_05_") + randNum))
|
|
|
|
|
|
fileName := fmt.Sprintf("%x", hashName) + ext
|
|
|
|
|
|
fpath := uploadDir + "/" + fileName
|
|
|
|
|
|
|
|
|
|
|
|
defer f.Close()
|
|
|
|
|
|
//写文件,保存excel文件
|
|
|
|
|
|
r := bufio.NewReader(f) //创建一个读取缓冲流
|
|
|
|
|
|
fo, err := os.Create(fpath) //创建输出*File
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
w := bufio.NewWriter(fo) //创建输出缓冲流
|
|
|
|
|
|
|
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
|
|
for {
|
|
|
|
|
|
n, err := r.Read(buf)
|
|
|
|
|
|
if err != nil && err != io.EOF {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
if n == 0 {
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if n2, err := w.Write(buf[:n]); err != nil {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
} else if n2 != n {
|
|
|
|
|
|
logs.Debug("error in writing")
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if err = w.Flush(); err != nil {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
webUrl := beego.AppConfig.String("webUrl")
|
|
|
|
|
|
if utils.ValiteDirExist(servergoftpdir) == false {
|
|
|
|
|
|
webUrl = "http://127.0.0.1:5000"
|
|
|
|
|
|
}
|
|
|
|
|
|
c.Ctx.WriteString("上传成功~!!!!!!!,文件URL:" + webUrl + "/goftp/file/getSingleFile?fileName=" + fileName)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// @Title PicUploadPost
|
|
|
|
|
|
// @Description 上传图片
|
|
|
|
|
|
// @router /picUploadPost [post]
|
|
|
|
|
|
func (c *FileOptUploadController) PicUploadPost() {
|
|
|
|
|
|
f, h, err := c.GetFile("file") //获取上传的文件
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
c.Ctx.WriteString("请选择上传的图片")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
ext := path.Ext(h.Filename)
|
|
|
|
|
|
//验证后缀名是否符合要求
|
|
|
|
|
|
var AllowExtMap map[string]bool = map[string]bool{
|
|
|
|
|
|
".jpg": true,
|
|
|
|
|
|
".jpeg": true,
|
|
|
|
|
|
".png": true,
|
|
|
|
|
|
}
|
|
|
|
|
|
if _, ok := AllowExtMap[ext]; !ok {
|
|
|
|
|
|
c.Ctx.WriteString("后缀名不符合上传要求")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//创建目录
|
|
|
|
|
|
//uploadDir := "static/upload/" + time.Now().Format("2006/01/02/")
|
|
|
|
|
|
servergoftpdir := beego.AppConfig.String("servergoftpdir")
|
|
|
|
|
|
uploadDir := utils.CreateDir("static", "pic")
|
|
|
|
|
|
uploadPath := "static" + "/" + "pic"
|
|
|
|
|
|
//构造文件名称
|
|
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
|
|
randNum := fmt.Sprintf("%d", rand.Intn(9999)+1000)
|
|
|
|
|
|
hashName := md5.Sum([]byte(time.Now().Format("2006_01_02_15_04_05_") + randNum))
|
|
|
|
|
|
fileName := fmt.Sprintf("%x", hashName) + ext
|
|
|
|
|
|
fpath := uploadDir + "/" + fileName
|
|
|
|
|
|
|
|
|
|
|
|
defer f.Close()
|
|
|
|
|
|
//写文件,保存excel文件
|
|
|
|
|
|
r := bufio.NewReader(f) //创建一个读取缓冲流
|
|
|
|
|
|
fo, err := os.Create(fpath) //创建输出*File
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
w := bufio.NewWriter(fo) //创建输出缓冲流
|
|
|
|
|
|
|
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
|
|
for {
|
|
|
|
|
|
n, err := r.Read(buf)
|
|
|
|
|
|
if err != nil && err != io.EOF {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
if n == 0 {
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if n2, err := w.Write(buf[:n]); err != nil {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
} else if n2 != n {
|
|
|
|
|
|
logs.Debug("error in writing")
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if err = w.Flush(); err != nil {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
//webUrl
|
|
|
|
|
|
webUrl := beego.AppConfig.String("webUrl")
|
|
|
|
|
|
if utils.ValiteDirExist(servergoftpdir) == false {
|
|
|
|
|
|
webUrl = "http://127.0.0.1:5000"
|
|
|
|
|
|
}
|
|
|
|
|
|
c.Ctx.WriteString("上传成功~!!!!!!!,文件路径为:" + webUrl + "/goftp/" + uploadPath + "/" + fileName)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// @Title GetSingleFile
|
|
|
|
|
|
// @Description 获取单个文件
|
|
|
|
|
|
// @Param fileName query string true "文件名称"
|
|
|
|
|
|
// @router /getSingleFile [get]
|
|
|
|
|
|
func (c *FileOptUploadController) GetSingleFile() {
|
|
|
|
|
|
//图片,text,pdf文件全部在浏览器中显示了,并没有完全的实现下载的功能
|
|
|
|
|
|
fileName := c.Ctx.Input.Query("fileName")
|
|
|
|
|
|
logs.Debug(fileName)
|
|
|
|
|
|
goftpdir := beego.AppConfig.String("macgoftpdir")
|
|
|
|
|
|
servergoftpdir := beego.AppConfig.String("servergoftpdir")
|
|
|
|
|
|
if utils.ValiteDirExist(servergoftpdir) == true {
|
|
|
|
|
|
goftpdir = servergoftpdir
|
|
|
|
|
|
}
|
|
|
|
|
|
logs.Debug(fileName)
|
|
|
|
|
|
if fileName == "" {
|
|
|
|
|
|
c.Ctx.WriteString("please input you want to download the file name!")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
filePath := goftpdir + "/" + fileName
|
|
|
|
|
|
if utils.ValiteFileExist(filePath) == false {
|
|
|
|
|
|
c.Ctx.WriteString("file not exist!")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
fileCountUpdateSuccess := service.UpdateDownloadCount(fileName)
|
|
|
|
|
|
if fileCountUpdateSuccess {
|
|
|
|
|
|
logs.Debug("fileCountUpdatesuccess")
|
|
|
|
|
|
} else {
|
|
|
|
|
|
logs.Debug("fileCountUpdateFail")
|
|
|
|
|
|
}
|
|
|
|
|
|
c.Download(filePath, fileName)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// @Title GetEx4File
|
|
|
|
|
|
// @Description 获取单个文件
|
|
|
|
|
|
// @Param fileName query string true "文件名称"
|
|
|
|
|
|
// @router /getEx4File [get]
|
|
|
|
|
|
func (c *FileOptUploadController) GetEx4File() {
|
|
|
|
|
|
//图片,text,pdf文件全部在浏览器中显示了,并没有完全的实现下载的功能
|
|
|
|
|
|
fileName := c.Ctx.Input.Query("fileName")
|
|
|
|
|
|
logs.Debug(fileName)
|
|
|
|
|
|
goftpdir := beego.AppConfig.String("macgoftpdir")
|
|
|
|
|
|
servergoftpdir := beego.AppConfig.String("servergoftpdir")
|
|
|
|
|
|
if utils.ValiteDirExist(servergoftpdir) == true {
|
|
|
|
|
|
goftpdir = servergoftpdir
|
|
|
|
|
|
}
|
|
|
|
|
|
logs.Debug(fileName)
|
|
|
|
|
|
if fileName == "" {
|
|
|
|
|
|
c.Ctx.WriteString("please input you want to download the file name!")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
filePath := goftpdir + "/" + fileName
|
|
|
|
|
|
if utils.ValiteFileExist(filePath) == false {
|
|
|
|
|
|
c.Ctx.WriteString("file not exist!")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
fileCountUpdateSuccess := service.UpdateDownloadCount(fileName)
|
|
|
|
|
|
if fileCountUpdateSuccess {
|
|
|
|
|
|
logs.Debug("fileCountUpdatesuccess")
|
|
|
|
|
|
} else {
|
|
|
|
|
|
logs.Debug("fileCountUpdateFail")
|
|
|
|
|
|
}
|
|
|
|
|
|
c.Download(filePath, fileName)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// @Title UploadBaseFilePost
|
|
|
|
|
|
// @Description 上传原文件,文件名称不会改变
|
|
|
|
|
|
// @router /uploadBaseFileToGoFtpDir [post]
|
|
|
|
|
|
func (c *FileOptUploadController) UploadBaseFileToPost() {
|
|
|
|
|
|
f, h, _ := c.GetFile("file") //获取上传的文件
|
|
|
|
|
|
//ext := path.Ext(h.Filename)
|
|
|
|
|
|
logs.Debug(h.Filename)
|
|
|
|
|
|
//创建目录
|
|
|
|
|
|
goftpdir := beego.AppConfig.String("macgoftpdir")
|
|
|
|
|
|
servergoftpdir := beego.AppConfig.String("servergoftpdir")
|
|
|
|
|
|
if utils.ValiteDirExist(servergoftpdir) == true {
|
|
|
|
|
|
goftpdir = servergoftpdir
|
|
|
|
|
|
}
|
|
|
|
|
|
uploadDir := utils.CreateBaseDir(goftpdir)
|
|
|
|
|
|
//uploadDir := utils.CreateBaseDir("/Users/edao/goftpdir");
|
|
|
|
|
|
//uploadDir := "/root/goftpdir"
|
|
|
|
|
|
//构造文件名称
|
|
|
|
|
|
// rand.Seed(time.Now().UnixNano())
|
|
|
|
|
|
// randNum := fmt.Sprintf("%d", rand.Intn(9999)+1000)
|
|
|
|
|
|
// hashName := md5.Sum([]byte(time.Now().Format("2006_01_02_15_04_05_") + randNum))
|
|
|
|
|
|
fileName := h.Filename
|
|
|
|
|
|
fpath := uploadDir + "/" + fileName
|
|
|
|
|
|
|
|
|
|
|
|
defer f.Close()
|
|
|
|
|
|
//写文件,保存excel文件
|
|
|
|
|
|
r := bufio.NewReader(f) //创建一个读取缓冲流
|
|
|
|
|
|
fo, err := os.Create(fpath) //创建输出*File
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
w := bufio.NewWriter(fo) //创建输出缓冲流
|
|
|
|
|
|
|
|
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
|
|
for {
|
|
|
|
|
|
n, err := r.Read(buf)
|
|
|
|
|
|
if err != nil && err != io.EOF {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
if n == 0 {
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if n2, err := w.Write(buf[:n]); err != nil {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
} else if n2 != n {
|
|
|
|
|
|
logs.Debug("error in writing")
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if err = w.Flush(); err != nil {
|
|
|
|
|
|
logs.Error(err)
|
|
|
|
|
|
}
|
|
|
|
|
|
webUrl := beego.AppConfig.String("webUrl")
|
|
|
|
|
|
if utils.ValiteDirExist(servergoftpdir) == false {
|
|
|
|
|
|
webUrl = "http://127.0.0.1:5000"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//c.Ctx.WriteString("上传成功~!!!!!!!,服务器文件路径为:" + fpath)
|
|
|
|
|
|
//c.Ctx.WriteString("\n")
|
|
|
|
|
|
//c.Ctx.ResponseWriter.AddHeader("content-disposition", "attachment; filename=\""+fileName+"\"")
|
|
|
|
|
|
c.Ctx.WriteString("上传成功~!!!!!!!,文件URL:" + webUrl + "/goftp/file/getSingleFile?fileName=" + fileName)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 重写beego框架 Download 方法,去掉文件名url.QueryEscape(fName)
|
|
|
|
|
|
func (c *FileOptUploadController) Download(file string, filename ...string) {
|
|
|
|
|
|
// check get file error, file not found or other error.
|
|
|
|
|
|
if _, err := os.Stat(file); err != nil {
|
|
|
|
|
|
http.ServeFile(c.Ctx.Output.Context.ResponseWriter, c.Ctx.Output.Context.Request, file)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
var fName string
|
|
|
|
|
|
if len(filename) > 0 && filename[0] != "" {
|
|
|
|
|
|
fName = filename[0]
|
|
|
|
|
|
} else {
|
|
|
|
|
|
fName = filepath.Base(file)
|
|
|
|
|
|
}
|
|
|
|
|
|
c.Ctx.Output.Header("Content-Disposition", "attachment; filename="+fName)
|
|
|
|
|
|
c.Ctx.Output.Header("Content-Description", "File Transfer")
|
|
|
|
|
|
c.Ctx.Output.Header("Content-Type", "application/octet-stream")
|
|
|
|
|
|
c.Ctx.Output.Header("Content-Transfer-Encoding", "binary")
|
|
|
|
|
|
c.Ctx.Output.Header("Expires", "0")
|
|
|
|
|
|
c.Ctx.Output.Header("Cache-Control", "must-revalidate")
|
|
|
|
|
|
c.Ctx.Output.Header("Pragma", "public")
|
|
|
|
|
|
http.ServeFile(c.Ctx.Output.Context.ResponseWriter, c.Ctx.Output.Context.Request, file)
|
|
|
|
|
|
}
|