|
|
|
@ -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)
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|