Ready to add the file downloader.

This commit is contained in:
zicla
2018-07-02 20:41:56 +08:00
parent bffc45535d
commit 1453d1a84b
3 changed files with 129 additions and 103 deletions

View File

@ -2,8 +2,6 @@ package rest
import (
"fmt"
"github.com/disintegration/imaging"
"io"
"net/http"
"net/url"
"os"
@ -348,118 +346,49 @@ func (this *AlienController) Download(writer http.ResponseWriter, request *http.
diskFile, err := os.Open(CONFIG.MatterPath + matter.Path)
this.PanicError(err)
defer diskFile.Close()
// 防止中文乱码
fileName := url.QueryEscape(matter.Name)
writer.Header().Set("Content-Type", GetMimeType(fileName))
mimeType := GetMimeType(fileName)
writer.Header().Set("Content-Type", mimeType)
//如果是图片或者文本就直接打开。
mimeType := GetMimeType(matter.Name)
if strings.Index(mimeType, "image") != 0 && strings.Index(mimeType, "text") != 0 {
//如果是图片或者文本或者视频就直接打开。其余的一律以下载形式返回。
if strings.Index(mimeType, "image") != 0 && strings.Index(mimeType, "text") != 0 && strings.Index(mimeType, "video") != 0 {
writer.Header().Set("content-disposition", "attachment; filename=\""+fileName+"\"")
}
//对图片做缩放处理。
imageProcess := request.FormValue("imageProcess")
if imageProcess == "resize" {
//当前的文件是否是图片,只有图片才能处理。
extension := GetExtension(matter.Name)
formats := map[string]imaging.Format{
".jpg": imaging.JPEG,
".jpeg": imaging.JPEG,
".png": imaging.PNG,
".tif": imaging.TIFF,
".tiff": imaging.TIFF,
".bmp": imaging.BMP,
".gif": imaging.GIF,
}
format, ok := formats[extension]
if !ok {
panic("该图片格式不支持处理")
}
imageResizeM := request.FormValue("imageResizeM")
if imageResizeM == "" {
imageResizeM = "fit"
} else if imageResizeM != "fit" && imageResizeM != "fill" && imageResizeM != "fixed" {
panic("imageResizeM参数错误")
}
imageResizeWStr := request.FormValue("imageResizeW")
var imageResizeW int
if imageResizeWStr != "" {
imageResizeW, err = strconv.Atoi(imageResizeWStr)
this.PanicError(err)
if imageResizeW < 1 || imageResizeW > 4096 {
panic("缩放尺寸不能超过4096")
}
}
imageResizeHStr := request.FormValue("imageResizeH")
var imageResizeH int
if imageResizeHStr != "" {
imageResizeH, err = strconv.Atoi(imageResizeHStr)
this.PanicError(err)
if imageResizeH < 1 || imageResizeH > 4096 {
panic("缩放尺寸不能超过4096")
}
}
//单边缩略
if imageResizeM == "fit" {
//将图缩略成宽度为100高度按比例处理。
if imageResizeW > 0 {
src, err := imaging.Decode(diskFile)
this.PanicError(err)
dst := imaging.Resize(src, imageResizeW, 0, imaging.Lanczos)
err = imaging.Encode(writer, dst, format)
this.PanicError(err)
} else if imageResizeH > 0 {
//将图缩略成高度为100宽度按比例处理。
src, err := imaging.Decode(diskFile)
this.PanicError(err)
dst := imaging.Resize(src, 0, imageResizeH, imaging.Lanczos)
err = imaging.Encode(writer, dst, format)
this.PanicError(err)
} else {
panic("单边缩略必须指定imageResizeW或imageResizeH")
}
} else if imageResizeM == "fill" {
//固定宽高,自动裁剪
if imageResizeW > 0 && imageResizeH > 0 {
src, err := imaging.Decode(diskFile)
this.PanicError(err)
dst := imaging.Fill(src, imageResizeW, imageResizeH, imaging.Center, imaging.Lanczos)
err = imaging.Encode(writer, dst, format)
this.PanicError(err)
} else {
panic("固定宽高,自动裁剪 必须同时指定imageResizeW和imageResizeH")
}
} else if imageResizeM == "fixed" {
//强制宽高缩略
if imageResizeW > 0 && imageResizeH > 0 {
src, err := imaging.Decode(diskFile)
this.PanicError(err)
dst := imaging.Resize(src, imageResizeW, imageResizeH, imaging.Lanczos)
err = imaging.Encode(writer, dst, format)
this.PanicError(err)
} else {
panic("强制宽高缩略必须同时指定imageResizeW和imageResizeH")
}
}
this.matterService.ResizeImage(writer, request, matter, diskFile)
} else {
//显示文件大小。
fileInfo, err := diskFile.Stat()
if err != nil {
panic(err)
}
writer.Header().Set("Content-Length", strconv.Itoa(int(fileInfo.Size())))
_, err = io.Copy(writer, diskFile)
this.PanicError(err)
//fileInfo, err := diskFile.Stat()
//if err != nil {
// panic(err)
//}
//
//contentLength := strconv.Itoa(int(fileInfo.Size()))
//writer.Header().Set("Content-Length", contentLength)
//
////如果是视频,支持断点下载。
//if strings.Index(mimeType, "video") == 0 {
//
// if request.Header.Get("Range") == "" {
// writer.Header().Set("Accept-Ranges", "bytes")
// } else {
// writer.Header().Set("Accept-Ranges", fmt.Sprintf("bytes 0-%s/%s", contentLength, contentLength))
// }
// writer.Header().Set("Connection", "keep-alive")
// //writer.Header().Set("ETag", "5b376c95-355866")
// writer.Header().Set("Last-Modified", "Sat, 30 Jun 2018 11:42:13 GMT")
// //writer.Header().Set("Server", "nginx/1.12.2")
//
//}
//
//_, err = io.Copy(writer, diskFile)
//this.PanicError(err)
}