diff --git a/rest/alien_controller.go b/rest/alien_controller.go index 088b1e2..6a84a65 100644 --- a/rest/alien_controller.go +++ b/rest/alien_controller.go @@ -17,6 +17,7 @@ type AlienController struct { matterService *MatterService imageCacheDao *ImageCacheDao imageCacheService *ImageCacheService + alienService *AlienService } //初始化方法 @@ -54,6 +55,11 @@ func (this *AlienController) Init(context *Context) { this.imageCacheService = c } + b = context.GetBean(this.alienService) + if c, ok := b.(*AlienService); ok { + this.alienService = c + } + } //注册自己的路由。 @@ -77,17 +83,27 @@ func (this *AlienController) HandleRoutes(writer http.ResponseWriter, request *h path := request.URL.Path - //匹配 /api/alien/download/{uuid}/{filename} - reg := regexp.MustCompile(`^/api/alien/download/([^/]+)/([^/]+)$`) + //匹配 /api/alien/preview/{uuid}/{filename} (响应头不包含 content-disposition) + reg := regexp.MustCompile(`^/api/alien/preview/([^/]+)/([^/]+)$`) strs := reg.FindStringSubmatch(path) - if len(strs) != 3 { - return nil, false - } else { + if len(strs) == 3 { + var f = func(writer http.ResponseWriter, request *http.Request) { + this.Preview(writer, request, strs[1], strs[2]) + } + return f, true + } + + //匹配 /api/alien/download/{uuid}/{filename} (响应头包含 content-disposition) + reg = regexp.MustCompile(`^/api/alien/download/([^/]+)/([^/]+)$`) + strs = reg.FindStringSubmatch(path) + if len(strs) == 3 { var f = func(writer http.ResponseWriter, request *http.Request) { this.Download(writer, request, strs[1], strs[2]) } return f, true } + + return nil, false } //直接使用邮箱和密码获取用户 @@ -385,71 +401,17 @@ func (this *AlienController) FetchDownloadToken(writer http.ResponseWriter, requ } -//下载一个文件。既可以使用登录的方式下载,也可以使用授权的方式下载。 -func (this *AlienController) Download(writer http.ResponseWriter, request *http.Request, uuid string, filename string) { - matter := this.matterDao.CheckByUuid(uuid) - - //判断是否是文件夹 - if matter.Dir { - panic("暂不支持下载文件夹") - } - - if matter.Name != filename { - panic("文件信息错误") - } - - //验证用户的权限问题。 - //文件如果是私有的才需要权限 - if matter.Privacy { - - //1.如果带有downloadTokenUuid那么就按照token的信息去获取。 - downloadTokenUuid := request.FormValue("downloadTokenUuid") - if downloadTokenUuid != "" { - downloadToken := this.downloadTokenDao.CheckByUuid(downloadTokenUuid) - if downloadToken.ExpireTime.Before(time.Now()) { - panic("downloadToken已失效") - } - - if downloadToken.MatterUuid != uuid { - panic("token和文件信息不一致") - } - - tokenUser := this.userDao.CheckByUuid(downloadToken.UserUuid) - if matter.UserUuid != tokenUser.Uuid { - panic(CODE_WRAPPER_UNAUTHORIZED) - } - - //下载之后立即过期掉。 - downloadToken.ExpireTime = time.Now().AddDate(0, 0, 1); - this.downloadTokenDao.Save(downloadToken) - - } else { - - //判断文件的所属人是否正确 - user := this.checkUser(writer, request) - if user.Role != USER_ROLE_ADMINISTRATOR && matter.UserUuid != user.Uuid { - panic(CODE_WRAPPER_UNAUTHORIZED) - } - - } - } - - //对图片处理。 - needProcess, _, _, _ := this.imageCacheService.ResizeParams(request) - if needProcess { - - //如果是图片,那么能用缓存就用缓存 - imageCache := this.imageCacheDao.FindByUri(request.RequestURI) - if imageCache == nil { - imageCache = this.imageCacheService.cacheImage(writer, request, matter) - } - - //直接使用缓存中的信息 - this.matterService.DownloadFile(writer, request, CONFIG.MatterPath+imageCache.Path, matter.Name) - - } else { - this.matterService.DownloadFile(writer, request, CONFIG.MatterPath+matter.Path, matter.Name) - } +//预览一个文件。既可以使用登录的方式,也可以使用授权的方式 +func (this *AlienController) Preview(writer http.ResponseWriter, request *http.Request, uuid string, filename string) { + operator := this.findUser(writer, request) + this.alienService.PreviewOrDownload(writer, request, uuid, filename, operator, false) +} + + +//下载一个文件。既可以使用登录的方式,也可以使用授权的方式 +func (this *AlienController) Download(writer http.ResponseWriter, request *http.Request, uuid string, filename string) { + operator := this.findUser(writer, request) + this.alienService.PreviewOrDownload(writer, request, uuid, filename, operator, true) } diff --git a/rest/alien_service.go b/rest/alien_service.go new file mode 100644 index 0000000..c0fe6dd --- /dev/null +++ b/rest/alien_service.go @@ -0,0 +1,135 @@ +package rest + +import ( + "net/http" + "time" + "fmt" +) + +//@Service +type AlienService struct { + Bean + matterDao *MatterDao + matterService *MatterService + userDao *UserDao + uploadTokenDao *UploadTokenDao + downloadTokenDao *DownloadTokenDao + imageCacheDao *ImageCacheDao + imageCacheService *ImageCacheService +} + +//初始化方法 +func (this *AlienService) Init(context *Context) { + + //手动装填本实例的Bean. 这里必须要用中间变量方可。 + b := context.GetBean(this.matterDao) + if b, ok := b.(*MatterDao); ok { + this.matterDao = b + } + + b = context.GetBean(this.matterService) + if b, ok := b.(*MatterService); ok { + this.matterService = b + } + + b = context.GetBean(this.userDao) + if b, ok := b.(*UserDao); ok { + this.userDao = b + } + + b = context.GetBean(this.uploadTokenDao) + if c, ok := b.(*UploadTokenDao); ok { + this.uploadTokenDao = c + } + + b = context.GetBean(this.downloadTokenDao) + if c, ok := b.(*DownloadTokenDao); ok { + this.downloadTokenDao = c + } + + b = context.GetBean(this.imageCacheDao) + if c, ok := b.(*ImageCacheDao); ok { + this.imageCacheDao = c + } + + b = context.GetBean(this.imageCacheService) + if c, ok := b.(*ImageCacheService); ok { + this.imageCacheService = c + } +} + +//预览或者下载的统一处理. +func (this *AlienService) PreviewOrDownload( + writer http.ResponseWriter, + request *http.Request, + uuid string, + filename string, + operator *User, + withContentDisposition bool) { + + LogInfo("预览或下载文件 " + uuid + " " + filename) + + matter := this.matterDao.CheckByUuid(uuid) + + //判断是否是文件夹 + if matter.Dir { + panic("不支持下载文件夹") + } + + if matter.Name != filename { + panic("文件信息错误") + } + + //验证用户的权限问题。 + //文件如果是私有的才需要权限 + if matter.Privacy { + + //1.如果带有downloadTokenUuid那么就按照token的信息去获取。 + downloadTokenUuid := request.FormValue("downloadTokenUuid") + if downloadTokenUuid != "" { + downloadToken := this.downloadTokenDao.CheckByUuid(downloadTokenUuid) + if downloadToken.ExpireTime.Before(time.Now()) { + panic("downloadToken已失效") + } + + if downloadToken.MatterUuid != uuid { + panic("token和文件信息不一致") + } + + tokenUser := this.userDao.CheckByUuid(downloadToken.UserUuid) + if matter.UserUuid != tokenUser.Uuid { + panic(CODE_WRAPPER_UNAUTHORIZED) + } + + //下载之后立即过期掉。 + downloadToken.ExpireTime = time.Now().AddDate(0, 0, 1); + this.downloadTokenDao.Save(downloadToken) + + } else { + + //判断文件的所属人是否正确 + if operator == nil || (operator.Role != USER_ROLE_ADMINISTRATOR && matter.UserUuid != operator.Uuid) { + panic(CODE_WRAPPER_UNAUTHORIZED) + } + + } + } + + //对图片处理。 + needProcess, imageResizeM, imageResizeW, imageResizeH := this.imageCacheService.ResizeParams(request) + if needProcess { + + //如果是图片,那么能用缓存就用缓存 + imageCache := this.imageCacheDao.FindByMatterUuidAndMode(matter.Uuid, fmt.Sprintf("%s_%d_%d", imageResizeM, imageResizeW, imageResizeH)) + if imageCache == nil { + imageCache = this.imageCacheService.cacheImage(writer, request, matter) + } + + //直接使用缓存中的信息 + this.matterService.DownloadFile(writer, request, CONFIG.MatterPath+imageCache.Path, matter.Name, withContentDisposition) + + } else { + this.matterService.DownloadFile(writer, request, CONFIG.MatterPath+matter.Path, matter.Name, withContentDisposition) + } + +} diff --git a/rest/base_controller.go b/rest/base_controller.go index 169c0ea..3dcf77b 100644 --- a/rest/base_controller.go +++ b/rest/base_controller.go @@ -131,6 +131,7 @@ func (this *BaseController) Error(err interface{}) *WebResult { return webResult } +//能找到一个user就找到一个,遇到问题直接抛出错误 func (this *BaseController) checkLogin(writer http.ResponseWriter, request *http.Request) (*Session, *User) { //验证用户是否已经登录。 @@ -159,11 +160,35 @@ func (this *BaseController) checkLogin(writer http.ResponseWriter, request *http } -func (this *BaseController) checkUser(writer http.ResponseWriter, request *http.Request) *User { +//能找到一个user就找到一个 +func (this *BaseController) findUser(writer http.ResponseWriter, request *http.Request) *User { + //验证用户是否已经登录。 + sessionCookie, err := request.Cookie(COOKIE_AUTH_KEY) + if err != nil { + LogError("找不到任何登录信息") + return nil + } + + session := this.sessionDao.FindByUuid(sessionCookie.Value) + if session != nil { + if session.ExpireTime.Before(time.Now()) { + LogError("登录信息已过期") + return nil + } else { + user := this.userDao.FindByUuid(session.UserUuid) + if user != nil { + return user + } + } + } + + return nil +} + +func (this *BaseController) checkUser(writer http.ResponseWriter, request *http.Request) *User { _, user := this.checkLogin(writer, request) return user - } //允许跨域请求 diff --git a/rest/context.go b/rest/context.go index 8697f4f..1f439e8 100644 --- a/rest/context.go +++ b/rest/context.go @@ -95,6 +95,7 @@ func (this *Context) registerBeans() { //alien this.registerBean(new(AlienController)) + this.registerBean(new(AlienService)) //downloadToken this.registerBean(new(DownloadTokenDao)) diff --git a/rest/image_cache_dao.go b/rest/image_cache_dao.go index 2fa3b90..2b01e04 100644 --- a/rest/image_cache_dao.go +++ b/rest/image_cache_dao.go @@ -7,6 +7,7 @@ import ( "github.com/nu7hatch/gouuid" "os" "time" + "strings" ) type ImageCacheDao struct { @@ -38,11 +39,17 @@ func (this *ImageCacheDao) CheckByUuid(uuid string) *ImageCache { } //按照名字查询文件夹 -func (this *ImageCacheDao) FindByUri(uri string) *ImageCache { +func (this *ImageCacheDao) FindByMatterUuidAndMode(matterUuid string, mode string) *ImageCache { var wp = &WherePair{} - wp = wp.And(&WherePair{Query: "uri = ?", Args: []interface{}{uri}}) + if matterUuid != "" { + wp = wp.And(&WherePair{Query: "matter_uuid = ?", Args: []interface{}{matterUuid}}) + } + + if mode != "" { + wp = wp.And(&WherePair{Query: "mode = ?", Args: []interface{}{mode}}) + } var imageCache = &ImageCache{} db := this.context.DB.Model(&ImageCache{}).Where(wp.Query, wp.Args...).First(imageCache) @@ -107,6 +114,7 @@ func (this *ImageCacheDao) Page(page int, pageSize int, userUuid string, matterU return pager } + //创建 func (this *ImageCacheDao) Create(imageCache *ImageCache) *ImageCache { @@ -130,18 +138,36 @@ func (this *ImageCacheDao) Save(imageCache *ImageCache) *ImageCache { return imageCache } +//删除一个文件包括文件夹 +func (this *ImageCacheDao) deleteFileAndDir(imageCache *ImageCache) { + + filePath := CONFIG.MatterPath + imageCache.Path + //递归找寻文件的上级目录uuid. 因为是/开头的缘故 + parts := strings.Split(imageCache.Path, "/") + dirPath := CONFIG.MatterPath + "/" + parts[1] + "/" + parts[2] + "/" + parts[3] + "/" + parts[4] + + //删除文件 + err := os.Remove(filePath) + if err != nil { + LogError(fmt.Sprintf("删除磁盘上的文件%s出错,不做任何处理 %s", filePath, err.Error())) + } + + //删除这一层文件夹 + err = os.Remove(dirPath) + if err != nil { + LogError(fmt.Sprintf("删除磁盘上的文件夹%s出错,不做任何处理 %s", dirPath, err.Error())) + } +} + + //删除一个文件,数据库中删除,物理磁盘上删除。 func (this *ImageCacheDao) Delete(imageCache *ImageCache) { db := this.context.DB.Delete(&imageCache) this.PanicError(db.Error) - //删除文件 - err := os.Remove(CONFIG.MatterPath + imageCache.Path) + this.deleteFileAndDir(imageCache) - if err != nil { - LogError(fmt.Sprintf("删除磁盘上的文件出错,不做任何处理 %s", err.Error())) - } } //删除一个matter对应的所有缓存 @@ -162,10 +188,7 @@ func (this *ImageCacheDao) DeleteByMatterUuid(matterUuid string) { //删除文件实体 for _, imageCache := range imageCaches { - err := os.Remove(CONFIG.MatterPath + imageCache.Path) - if err != nil { - LogError(fmt.Sprintf("删除磁盘上的文件出错,不做任何处理")) - } + this.deleteFileAndDir(imageCache) } } diff --git a/rest/image_cache_model.go b/rest/image_cache_model.go index a36369f..a7adbd8 100644 --- a/rest/image_cache_model.go +++ b/rest/image_cache_model.go @@ -7,7 +7,7 @@ type ImageCache struct { Base UserUuid string `json:"userUuid"` MatterUuid string `json:"matterUuid"` - Uri string `json:"uri"` + Mode string `json:"mode"` Md5 string `json:"md5"` Size int64 `json:"size"` Path string `json:"path"` diff --git a/rest/image_cache_service.go b/rest/image_cache_service.go index a7092a1..835ee63 100644 --- a/rest/image_cache_service.go +++ b/rest/image_cache_service.go @@ -6,8 +6,8 @@ import ( "os" "strconv" "github.com/disintegration/imaging" - "net/url" "strings" + "fmt" ) //@Service @@ -108,7 +108,6 @@ func (this *ImageCacheService) ResizeParams(request *http.Request) (needProcess } return true, imageResizeM, imageResizeW, imageResizeH } else { - LogInfo("没有有效的处理参数,不进行图片处理") return false, "", 0, 0 } @@ -168,11 +167,8 @@ func (this *ImageCacheService) ResizeImage(request *http.Request, filePath strin //缓存一张处理完毕了的图片 func (this *ImageCacheService) cacheImage(writer http.ResponseWriter, request *http.Request, matter *Matter) *ImageCache { - // 防止中文乱码 - fileName := url.QueryEscape(matter.Name) - //当前的文件是否是图片,只有图片才能处理。 - extension := GetExtension(fileName) + extension := GetExtension(matter.Name) formats := map[string]imaging.Format{ ".jpg": imaging.JPEG, ".jpeg": imaging.JPEG, @@ -194,8 +190,8 @@ func (this *ImageCacheService) cacheImage(writer http.ResponseWriter, request *h user := this.userDao.FindByUuid(matter.UserUuid) //获取文件应该存放在的物理路径的绝对路径和相对路径。 absolutePath, relativePath := GetUserFilePath(user.Username, true) - absolutePath = absolutePath + "/" + fileName - relativePath = relativePath + "/" + fileName + absolutePath = absolutePath + "/" + matter.Name + relativePath = relativePath + "/" + matter.Name fileWriter, err := os.Create(absolutePath) this.PanicError(err) @@ -209,11 +205,13 @@ func (this *ImageCacheService) cacheImage(writer http.ResponseWriter, request *h fileInfo, err := fileWriter.Stat() this.PanicError(err) + _, imageResizeM, imageResizeW, imageResizeH := this.ResizeParams(request) + //相关信息写到缓存中去 imageCache := &ImageCache{ UserUuid: matter.UserUuid, MatterUuid: matter.Uuid, - Uri: request.RequestURI, + Mode: fmt.Sprintf("%s_%d_%d", imageResizeM, imageResizeW, imageResizeH), Size: fileInfo.Size(), Path: relativePath, } diff --git a/rest/matter_dao.go b/rest/matter_dao.go index 05890cc..2b4b42d 100644 --- a/rest/matter_dao.go +++ b/rest/matter_dao.go @@ -7,6 +7,7 @@ import ( "github.com/nu7hatch/gouuid" "os" "time" + "strings" ) type MatterDao struct { @@ -238,11 +239,21 @@ func (this *MatterDao) Delete(matter *Matter) { //删除对应的缓存图片。 this.imageCacheDao.DeleteByMatterUuid(matter.Uuid) - //删除文件 - err := os.Remove(CONFIG.MatterPath + matter.Path) + filePath := CONFIG.MatterPath + matter.Path + //递归找寻文件的上级目录uuid. 因为是/开头的缘故 + parts := strings.Split(matter.Path, "/") + dirPath := CONFIG.MatterPath + "/" + parts[1] + "/" + parts[2] + "/" + parts[3] + //删除文件 + err := os.Remove(filePath) if err != nil { - LogError(fmt.Sprintf("删除磁盘上的文件出错,不做任何处理")) + LogError(fmt.Sprintf("删除磁盘上的文件出错,不做任何处理 %s", err.Error())) + } + + //删除这一层文件夹 + err = os.Remove(dirPath) + if err != nil { + LogError(fmt.Sprintf("删除磁盘上的文件夹出错,不做任何处理 %s", err.Error())) } } diff --git a/rest/matter_service.go b/rest/matter_service.go index a2b1e63..49475c3 100644 --- a/rest/matter_service.go +++ b/rest/matter_service.go @@ -4,16 +4,15 @@ import ( "errors" "fmt" "io" - "mime" "mime/multipart" "net/http" "net/textproto" "os" - "path/filepath" "regexp" "strconv" "strings" "time" + "net/url" ) //@Service @@ -431,20 +430,22 @@ func (this *MatterService) sumRangesSize(ranges []httpRange) (size int64) { //文件下载。具有进度功能。 //下载功能参考:https://github.com/Masterminds/go-fileserver -func (this *MatterService) DownloadFile(writer http.ResponseWriter, request *http.Request, filePath string, filename string) { +func (this *MatterService) DownloadFile( + writer http.ResponseWriter, + request *http.Request, + filePath string, + filename string, + withContentDisposition bool) { diskFile, err := os.Open(filePath) this.PanicError(err) defer diskFile.Close() //如果是图片或者文本或者视频就直接打开。其余的一律以下载形式返回。 - //fileName := url.QueryEscape(filename) - //mimeType := GetMimeType(fileName) - //if strings.Index(mimeType, "image") != 0 && - // strings.Index(mimeType, "text") != 0 && - // strings.Index(mimeType, "video") != 0 { - // writer.Header().Set("content-disposition", "attachment; filename=\""+fileName+"\"") - //} + if withContentDisposition { + fileName := url.QueryEscape(filename) + writer.Header().Set("content-disposition", "attachment; filename=\""+fileName+"\"") + } //显示文件大小。 fileInfo, err := diskFile.Stat() @@ -473,7 +474,10 @@ func (this *MatterService) DownloadFile(writer http.ResponseWriter, request *htt ctypes, haveType := writer.Header()["Content-Type"] var ctype string if !haveType { - ctype = mime.TypeByExtension(filepath.Ext(fileInfo.Name())) + //放弃原有的判断mime的方法 + //ctype = mime.TypeByExtension(filepath.Ext(fileInfo.Name())) + //使用mimeUtil来获取mime + ctype = GetFallbackMimeType(filename, "") if ctype == "" { // read a chunk to decide between utf-8 text and binary var buf [sniffLen]byte diff --git a/rest/util_mime.go b/rest/util_mime.go index b23490b..c4bf518 100644 --- a/rest/util_mime.go +++ b/rest/util_mime.go @@ -5,6 +5,617 @@ import ( "strings" ) +var allMimeMap = map[string]string{ + ".323": "text/h323", + ".3g2": "video/3gpp2", + ".3gp": "video/3gpp", + ".3gp2": "video/3gpp2", + ".3gpp": "video/3gpp", + ".7z": "application/x-7z-compressed", + ".aa": "audio/audible", + ".AAC": "audio/aac", + ".aaf": "application/octet-stream", + ".aax": "audio/vnd.audible.aax", + ".ac3": "audio/ac3", + ".aca": "application/octet-stream", + ".accda": "application/msaccess.addin", + ".accdb": "application/msaccess", + ".accdc": "application/msaccess.cab", + ".accde": "application/msaccess", + ".accdr": "application/msaccess.runtime", + ".accdt": "application/msaccess", + ".accdw": "application/msaccess.webapplication", + ".accft": "application/msaccess.ftemplate", + ".acx": "application/internet-property-stream", + ".AddIn": "text/xml", + ".ade": "application/msaccess", + ".adobebridge": "application/x-bridge-url", + ".adp": "application/msaccess", + ".ADT": "audio/vnd.dlna.adts", + ".ADTS": "audio/aac", + ".afm": "application/octet-stream", + ".ai": "application/postscript", + ".aif": "audio/aiff", + ".aifc": "audio/aiff", + ".aiff": "audio/aiff", + ".air": "application/vnd.adobe.air-application-installer-package+zip", + ".amc": "application/mpeg", + ".anx": "application/annodex", + ".apk": "application/vnd.android.package-archive", + ".application": "application/x-ms-application", + ".art": "image/x-jg", + ".asa": "application/xml", + ".asax": "application/xml", + ".ascx": "application/xml", + ".asd": "application/octet-stream", + ".asf": "video/x-ms-asf", + ".ashx": "application/xml", + ".asi": "application/octet-stream", + ".asm": "text/plain", + ".asmx": "application/xml", + ".aspx": "application/xml", + ".asr": "video/x-ms-asf", + ".asx": "video/x-ms-asf", + ".atom": "application/atom+xml", + ".au": "audio/basic", + ".avi": "video/x-msvideo", + ".axa": "audio/annodex", + ".axs": "application/olescript", + ".axv": "video/annodex", + ".bas": "text/plain", + ".bat": "text/plain", + ".bcpio": "application/x-bcpio", + ".bin": "application/octet-stream", + ".bmp": "image/bmp", + ".c": "text/plain", + ".cab": "application/octet-stream", + ".caf": "audio/x-caf", + ".calx": "application/vnd.ms-office.calx", + ".cat": "application/vnd.ms-pki.seccat", + ".cc": "text/plain", + ".cd": "text/plain", + ".cdda": "audio/aiff", + ".cdf": "application/x-cdf", + ".cer": "application/x-x509-ca-cert", + ".cfg": "text/plain", + ".chm": "application/octet-stream", + ".class": "application/x-java-applet", + ".clp": "application/x-msclip", + ".cmd": "text/plain", + ".cmx": "image/x-cmx", + ".cnf": "text/plain", + ".cod": "image/cis-cod", + ".config": "application/xml", + ".contact": "text/x-ms-contact", + ".coverage": "application/xml", + ".cpio": "application/x-cpio", + ".cpp": "text/plain", + ".crd": "application/x-mscardfile", + ".crl": "application/pkix-crl", + ".crt": "application/x-x509-ca-cert", + ".cs": "text/plain", + ".csdproj": "text/plain", + ".csh": "application/x-csh", + ".csproj": "text/plain", + ".css": "text/css", + ".csv": "text/csv", + ".cur": "application/octet-stream", + ".cxx": "text/plain", + ".dat": "application/octet-stream", + ".datasource": "application/xml", + ".dbproj": "text/plain", + ".dcr": "application/x-director", + ".def": "text/plain", + ".deploy": "application/octet-stream", + ".der": "application/x-x509-ca-cert", + ".dgml": "application/xml", + ".dib": "image/bmp", + ".dif": "video/x-dv", + ".dir": "application/x-director", + ".disco": "text/xml", + ".divx": "video/divx", + ".dll": "application/x-msdownload", + ".dll.config": "text/xml", + ".dlm": "text/dlm", + ".doc": "application/msword", + ".docm": "application/vnd.ms-word.document.macroEnabled.12", + ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ".dot": "application/msword", + ".dotm": "application/vnd.ms-word.template.macroEnabled.12", + ".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template", + ".dsp": "application/octet-stream", + ".dsw": "text/plain", + ".dtd": "text/xml", + ".dtsConfig": "text/xml", + ".dv": "video/x-dv", + ".dvi": "application/x-dvi", + ".dwf": "drawing/x-dwf", + ".dwg": "application/acad", + ".dwp": "application/octet-stream", + ".dxf": "application/x-dxf", + ".dxr": "application/x-director", + ".eml": "message/rfc822", + ".emz": "application/octet-stream", + ".eot": "application/vnd.ms-fontobject", + ".eps": "application/postscript", + ".etl": "application/etl", + ".etx": "text/x-setext", + ".evy": "application/envoy", + ".exe": "application/octet-stream", + ".exe.config": "text/xml", + ".fdf": "application/vnd.fdf", + ".fif": "application/fractals", + ".filters": "application/xml", + ".fla": "application/octet-stream", + ".flac": "audio/flac", + ".flr": "x-world/x-vrml", + ".flv": "video/x-flv", + ".fsscript": "application/fsharp-script", + ".fsx": "application/fsharp-script", + ".generictest": "application/xml", + ".gif": "image/gif", + ".go": "text/plain", + ".gpx": "application/gpx+xml", + ".group": "text/x-ms-group", + ".gsm": "audio/x-gsm", + ".gradle": "text/plain", + ".gtar": "application/x-gtar", + ".gz": "application/x-gzip", + ".h": "text/plain", + ".hdf": "application/x-hdf", + ".hdml": "text/x-hdml", + ".hhc": "application/x-oleobject", + ".hhk": "application/octet-stream", + ".hhp": "application/octet-stream", + ".hlp": "application/winhlp", + ".hpp": "text/plain", + ".hqx": "application/mac-binhex40", + ".hta": "application/hta", + ".htc": "text/x-component", + ".htm": "text/html", + ".html": "text/html", + ".htt": "text/webviewhtml", + ".hxa": "application/xml", + ".hxc": "application/xml", + ".hxd": "application/octet-stream", + ".hxe": "application/xml", + ".hxf": "application/xml", + ".hxh": "application/octet-stream", + ".hxi": "application/octet-stream", + ".hxk": "application/xml", + ".hxq": "application/octet-stream", + ".hxr": "application/octet-stream", + ".hxs": "application/octet-stream", + ".hxt": "text/html", + ".hxv": "application/xml", + ".hxw": "application/octet-stream", + ".hxx": "text/plain", + ".i": "text/plain", + ".ico": "image/x-icon", + ".ics": "application/octet-stream", + ".idl": "text/plain", + ".ief": "image/ief", + ".iii": "application/x-iphone", + ".inc": "text/plain", + ".inf": "application/octet-stream", + ".ini": "text/plain", + ".inl": "text/plain", + ".ins": "application/x-internet-signup", + ".ipa": "application/x-itunes-ipa", + ".ipg": "application/x-itunes-ipg", + ".ipproj": "text/plain", + ".ipsw": "application/x-itunes-ipsw", + ".iqy": "text/x-ms-iqy", + ".isp": "application/x-internet-signup", + ".ite": "application/x-itunes-ite", + ".itlp": "application/x-itunes-itlp", + ".itms": "application/x-itunes-itms", + ".itpc": "application/x-itunes-itpc", + ".IVF": "video/x-ivf", + ".jar": "application/java-archive", + ".java": "text/plain", + ".jck": "application/liquidmotion", + ".jcz": "application/liquidmotion", + ".jfif": "image/pjpeg", + ".jnlp": "application/x-java-jnlp-file", + ".jpb": "application/octet-stream", + ".jpe": "image/jpeg", + ".jpeg": "image/jpeg", + ".jpg": "image/jpeg", + ".js": "application/javascript", + ".json": "application/json", + ".jsx": "text/jscript", + ".jsxbin": "text/plain", + ".latex": "application/x-latex", + ".library-ms": "application/windows-library+xml", + ".lit": "application/x-ms-reader", + ".loadtest": "application/xml", + ".lpk": "application/octet-stream", + ".lsf": "video/x-la-asf", + ".lst": "text/plain", + ".lsx": "video/x-la-asf", + ".lzh": "application/octet-stream", + ".m13": "application/x-msmediaview", + ".m14": "application/x-msmediaview", + ".m1v": "video/mpeg", + ".m2t": "video/vnd.dlna.mpeg-tts", + ".m2ts": "video/vnd.dlna.mpeg-tts", + ".m2v": "video/mpeg", + ".m3u": "audio/x-mpegurl", + ".m3u8": "audio/x-mpegurl", + ".m4a": "audio/m4a", + ".m4b": "audio/m4b", + ".m4p": "audio/m4p", + ".m4r": "audio/x-m4r", + ".m4v": "video/x-m4v", + ".mac": "image/x-macpaint", + ".mak": "text/plain", + ".man": "application/x-troff-man", + ".manifest": "application/x-ms-manifest", + ".map": "text/plain", + ".master": "application/xml", + ".mbox": "application/mbox", + ".mda": "application/msaccess", + ".mdb": "application/x-msaccess", + ".mde": "application/msaccess", + ".mdp": "application/octet-stream", + ".me": "application/x-troff-me", + ".mfp": "application/x-shockwave-flash", + ".mht": "message/rfc822", + ".mhtml": "message/rfc822", + ".mid": "audio/mid", + ".midi": "audio/mid", + ".mix": "application/octet-stream", + ".mk": "text/plain", + ".mmf": "application/x-smaf", + ".mno": "text/xml", + ".mny": "application/x-msmoney", + ".mod": "video/mpeg", + ".mov": "video/quicktime", + ".movie": "video/x-sgi-movie", + ".mp2": "video/mpeg", + ".mp2v": "video/mpeg", + ".mp3": "audio/mpeg", + ".mp4": "video/mp4", + ".mp4v": "video/mp4", + ".mpa": "video/mpeg", + ".mpe": "video/mpeg", + ".mpeg": "video/mpeg", + ".mpf": "application/vnd.ms-mediapackage", + ".mpg": "video/mpeg", + ".mpp": "application/vnd.ms-project", + ".mpv2": "video/mpeg", + ".mqv": "video/quicktime", + ".ms": "application/x-troff-ms", + ".msg": "application/vnd.ms-outlook", + ".msi": "application/octet-stream", + ".mso": "application/octet-stream", + ".mts": "video/vnd.dlna.mpeg-tts", + ".mtx": "application/xml", + ".mvb": "application/x-msmediaview", + ".mvc": "application/x-miva-compiled", + ".mxp": "application/x-mmxp", + ".nc": "application/x-netcdf", + ".nsc": "video/x-ms-asf", + ".nws": "message/rfc822", + ".ocx": "application/octet-stream", + ".oda": "application/oda", + ".odb": "application/vnd.oasis.opendocument.database", + ".odc": "application/vnd.oasis.opendocument.chart", + ".odf": "application/vnd.oasis.opendocument.formula", + ".odg": "application/vnd.oasis.opendocument.graphics", + ".odh": "text/plain", + ".odi": "application/vnd.oasis.opendocument.image", + ".odl": "text/plain", + ".odm": "application/vnd.oasis.opendocument.text-master", + ".odp": "application/vnd.oasis.opendocument.presentation", + ".ods": "application/vnd.oasis.opendocument.spreadsheet", + ".odt": "application/vnd.oasis.opendocument.text", + ".oga": "audio/ogg", + ".ogg": "audio/ogg", + ".ogv": "video/ogg", + ".ogx": "application/ogg", + ".one": "application/onenote", + ".onea": "application/onenote", + ".onepkg": "application/onenote", + ".onetmp": "application/onenote", + ".onetoc": "application/onenote", + ".onetoc2": "application/onenote", + ".opus": "audio/ogg", + ".orderedtest": "application/xml", + ".osdx": "application/opensearchdescription+xml", + ".otf": "application/font-sfnt", + ".otg": "application/vnd.oasis.opendocument.graphics-template", + ".oth": "application/vnd.oasis.opendocument.text-web", + ".otp": "application/vnd.oasis.opendocument.presentation-template", + ".ots": "application/vnd.oasis.opendocument.spreadsheet-template", + ".ott": "application/vnd.oasis.opendocument.text-template", + ".oxt": "application/vnd.openofficeorg.extension", + ".p10": "application/pkcs10", + ".p12": "application/x-pkcs12", + ".p7b": "application/x-pkcs7-certificates", + ".p7c": "application/pkcs7-mime", + ".p7m": "application/pkcs7-mime", + ".p7r": "application/x-pkcs7-certreqresp", + ".p7s": "application/pkcs7-signature", + ".pbm": "image/x-portable-bitmap", + ".pcast": "application/x-podcast", + ".pct": "image/pict", + ".pcx": "application/octet-stream", + ".pcz": "application/octet-stream", + ".pdf": "application/pdf", + ".pfb": "application/octet-stream", + ".pfm": "application/octet-stream", + ".pfx": "application/x-pkcs12", + ".pgm": "image/x-portable-graymap", + ".pic": "image/pict", + ".pict": "image/pict", + ".pkgdef": "text/plain", + ".pkgundef": "text/plain", + ".pko": "application/vnd.ms-pki.pko", + ".pls": "audio/scpls", + ".pma": "application/x-perfmon", + ".pmc": "application/x-perfmon", + ".pml": "application/x-perfmon", + ".pmr": "application/x-perfmon", + ".pmw": "application/x-perfmon", + ".png": "image/png", + ".pnm": "image/x-portable-anymap", + ".pnt": "image/x-macpaint", + ".pntg": "image/x-macpaint", + ".pnz": "image/png", + ".pot": "application/vnd.ms-powerpoint", + ".potm": "application/vnd.ms-powerpoint.template.macroEnabled.12", + ".potx": "application/vnd.openxmlformats-officedocument.presentationml.template", + ".ppa": "application/vnd.ms-powerpoint", + ".ppam": "application/vnd.ms-powerpoint.addin.macroEnabled.12", + ".ppm": "image/x-portable-pixmap", + ".pps": "application/vnd.ms-powerpoint", + ".ppsm": "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", + ".ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow", + ".ppt": "application/vnd.ms-powerpoint", + ".pptm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12", + ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", + ".prf": "application/pics-rules", + ".prm": "application/octet-stream", + ".prx": "application/octet-stream", + ".ps": "application/postscript", + ".py": "text/plain", + ".psc1": "application/PowerShell", + ".psd": "application/octet-stream", + ".psess": "application/xml", + ".psm": "application/octet-stream", + ".psp": "application/octet-stream", + ".pst": "application/vnd.ms-outlook", + ".pub": "application/x-mspublisher", + ".pwz": "application/vnd.ms-powerpoint", + ".qht": "text/x-html-insertion", + ".qhtm": "text/x-html-insertion", + ".qt": "video/quicktime", + ".qti": "image/x-quicktime", + ".qtif": "image/x-quicktime", + ".qtl": "application/x-quicktimeplayer", + ".qxd": "application/octet-stream", + ".ra": "audio/x-pn-realaudio", + ".ram": "audio/x-pn-realaudio", + ".rar": "application/x-rar-compressed", + ".ras": "image/x-cmu-raster", + ".rat": "application/rat-file", + ".rc": "text/plain", + ".rc2": "text/plain", + ".rct": "text/plain", + ".rdlc": "application/xml", + ".reg": "text/plain", + ".resx": "application/xml", + ".rf": "image/vnd.rn-realflash", + ".rgb": "image/x-rgb", + ".rgs": "text/plain", + ".rm": "application/vnd.rn-realmedia", + ".rmi": "audio/mid", + ".rmp": "application/vnd.rn-rn_music_package", + ".roff": "application/x-troff", + ".rpm": "audio/x-pn-realaudio-plugin", + ".rqy": "text/x-ms-rqy", + ".rtf": "application/rtf", + ".rtx": "text/richtext", + ".rvt": "application/octet-stream", + ".ruleset": "application/xml", + ".s": "text/plain", + ".safariextz": "application/x-safari-safariextz", + ".scd": "application/x-msschedule", + ".scr": "text/plain", + ".sct": "text/scriptlet", + ".sd2": "audio/x-sd2", + ".sdp": "application/sdp", + ".sea": "application/octet-stream", + ".searchConnector-ms": "application/windows-search-connector+xml", + ".setpay": "application/set-payment-initiation", + ".setreg": "application/set-registration-initiation", + ".settings": "application/xml", + ".sgimb": "application/x-sgimb", + ".sgml": "text/sgml", + ".sh": "text/plain", + ".shar": "application/x-shar", + ".shtml": "text/html", + ".sit": "application/x-stuffit", + ".sitemap": "application/xml", + ".skin": "application/xml", + ".skp": "application/x-koan", + ".sldm": "application/vnd.ms-powerpoint.slide.macroEnabled.12", + ".sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide", + ".slk": "application/vnd.ms-excel", + ".sln": "text/plain", + ".slupkg-ms": "application/x-ms-license", + ".smd": "audio/x-smd", + ".smi": "application/octet-stream", + ".smx": "audio/x-smd", + ".smz": "audio/x-smd", + ".snd": "audio/basic", + ".snippet": "application/xml", + ".snp": "application/octet-stream", + ".sol": "text/plain", + ".sor": "text/plain", + ".spc": "application/x-pkcs7-certificates", + ".spl": "application/futuresplash", + ".spx": "audio/ogg", + ".src": "application/x-wais-source", + ".srf": "text/plain", + ".SSISDeploymentManifest": "text/xml", + ".ssm": "application/streamingmedia", + ".sst": "application/vnd.ms-pki.certstore", + ".stl": "application/vnd.ms-pki.stl", + ".sv4cpio": "application/x-sv4cpio", + ".sv4crc": "application/x-sv4crc", + ".svc": "application/xml", + ".svg": "image/svg+xml", + ".swf": "application/x-shockwave-flash", + ".step": "application/step", + ".stp": "application/step", + ".t": "application/x-troff", + ".tar": "application/x-tar", + ".tcl": "application/x-tcl", + ".testrunconfig": "application/xml", + ".testsettings": "application/xml", + ".tex": "application/x-tex", + ".texi": "application/x-texinfo", + ".texinfo": "application/x-texinfo", + ".tgz": "application/x-compressed", + ".thmx": "application/vnd.ms-officetheme", + ".thn": "application/octet-stream", + ".tif": "image/tiff", + ".tiff": "image/tiff", + ".tlh": "text/plain", + ".tli": "text/plain", + ".toc": "application/octet-stream", + ".tr": "application/x-troff", + ".trm": "application/x-msterminal", + ".trx": "application/xml", + ".ts": "video/vnd.dlna.mpeg-tts", + ".tsv": "text/tab-separated-values", + ".ttf": "application/font-sfnt", + ".tts": "video/vnd.dlna.mpeg-tts", + ".txt": "text/plain", + ".u32": "application/octet-stream", + ".uls": "text/iuls", + ".user": "text/plain", + ".ustar": "application/x-ustar", + ".vb": "text/plain", + ".vbdproj": "text/plain", + ".vbk": "video/mpeg", + ".vbproj": "text/plain", + ".vbs": "text/vbscript", + ".vcf": "text/x-vcard", + ".vcproj": "application/xml", + ".vcs": "text/plain", + ".vcxproj": "application/xml", + ".vddproj": "text/plain", + ".vdp": "text/plain", + ".vdproj": "text/plain", + ".vdx": "application/vnd.ms-visio.viewer", + ".vml": "text/xml", + ".vscontent": "application/xml", + ".vsct": "text/xml", + ".vsd": "application/vnd.visio", + ".vsi": "application/ms-vsi", + ".vsix": "application/vsix", + ".vsixlangpack": "text/xml", + ".vsixmanifest": "text/xml", + ".vsmdi": "application/xml", + ".vspscc": "text/plain", + ".vss": "application/vnd.visio", + ".vsscc": "text/plain", + ".vssettings": "text/xml", + ".vssscc": "text/plain", + ".vst": "application/vnd.visio", + ".vstemplate": "text/xml", + ".vsto": "application/x-ms-vsto", + ".vsw": "application/vnd.visio", + ".vsx": "application/vnd.visio", + ".vtx": "application/vnd.visio", + ".wav": "audio/wav", + ".wave": "audio/wav", + ".wax": "audio/x-ms-wax", + ".wbk": "application/msword", + ".wbmp": "image/vnd.wap.wbmp", + ".wcm": "application/vnd.ms-works", + ".wdb": "application/vnd.ms-works", + ".wdp": "image/vnd.ms-photo", + ".webarchive": "application/x-safari-webarchive", + ".webm": "video/webm", + ".webp": "image/webp", /* https"://en.wikipedia.org/wiki/WebP */ + ".webtest": "application/xml", + ".wiq": "application/xml", + ".wiz": "application/msword", + ".wks": "application/vnd.ms-works", + ".WLMP": "application/wlmoviemaker", + ".wlpginstall": "application/x-wlpg-detect", + ".wlpginstall3": "application/x-wlpg3-detect", + ".wm": "video/x-ms-wm", + ".wma": "audio/x-ms-wma", + ".wmd": "application/x-ms-wmd", + ".wmf": "application/x-msmetafile", + ".wml": "text/vnd.wap.wml", + ".wmlc": "application/vnd.wap.wmlc", + ".wmls": "text/vnd.wap.wmlscript", + ".wmlsc": "application/vnd.wap.wmlscriptc", + ".wmp": "video/x-ms-wmp", + ".wmv": "video/x-ms-wmv", + ".wmx": "video/x-ms-wmx", + ".wmz": "application/x-ms-wmz", + ".woff": "application/font-woff", + ".wpl": "application/vnd.ms-wpl", + ".wps": "application/vnd.ms-works", + ".wri": "application/x-mswrite", + ".wrl": "x-world/x-vrml", + ".wrz": "x-world/x-vrml", + ".wsc": "text/scriptlet", + ".wsdl": "text/xml", + ".wvx": "video/x-ms-wvx", + ".x": "application/directx", + ".xaf": "x-world/x-vrml", + ".xaml": "application/xaml+xml", + ".xap": "application/x-silverlight-app", + ".xbap": "application/x-ms-xbap", + ".xbm": "image/x-xbitmap", + ".xdr": "text/plain", + ".xht": "application/xhtml+xml", + ".xhtml": "application/xhtml+xml", + ".xla": "application/vnd.ms-excel", + ".xlam": "application/vnd.ms-excel.addin.macroEnabled.12", + ".xlc": "application/vnd.ms-excel", + ".xld": "application/vnd.ms-excel", + ".xlk": "application/vnd.ms-excel", + ".xll": "application/vnd.ms-excel", + ".xlm": "application/vnd.ms-excel", + ".xls": "application/vnd.ms-excel", + ".xlsb": "application/vnd.ms-excel.sheet.binary.macroEnabled.12", + ".xlsm": "application/vnd.ms-excel.sheet.macroEnabled.12", + ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ".xlt": "application/vnd.ms-excel", + ".xltm": "application/vnd.ms-excel.template.macroEnabled.12", + ".xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template", + ".xlw": "application/vnd.ms-excel", + ".xml": "text/xml", + ".xmp": "application/octet-stream", + ".xmta": "application/xml", + ".xof": "x-world/x-vrml", + ".XOML": "text/plain", + ".xpm": "image/x-xpixmap", + ".xps": "application/vnd.ms-xpsdocument", + ".xrm-ms": "text/xml", + ".xsc": "application/xml", + ".xsd": "text/xml", + ".xsf": "text/xml", + ".xsl": "text/xml", + ".xslt": "text/xml", + ".xsn": "application/octet-stream", + ".xss": "application/xml", + ".xspf": "application/xspf+xml", + ".xtp": "application/octet-stream", + ".xwd": "image/x-xwindowdump", + ".z": "application/x-compress", + ".zip": "application/zip"} + //根据文件名字获取后缀名,均是小写。 func GetExtension(filename string) string { @@ -14,621 +625,26 @@ func GetExtension(filename string) string { } -//根据一个后缀名获取MimeType +//根据一个后缀名获取MimeType,获取不到默认返回 "application/octet-stream" func GetMimeType(filename string) string { extension := GetExtension(filename) - mimeMap := map[string]string{ - ".323": "text/h323", - ".3g2": "video/3gpp2", - ".3gp": "video/3gpp", - ".3gp2": "video/3gpp2", - ".3gpp": "video/3gpp", - ".7z": "application/x-7z-compressed", - ".aa": "audio/audible", - ".AAC": "audio/aac", - ".aaf": "application/octet-stream", - ".aax": "audio/vnd.audible.aax", - ".ac3": "audio/ac3", - ".aca": "application/octet-stream", - ".accda": "application/msaccess.addin", - ".accdb": "application/msaccess", - ".accdc": "application/msaccess.cab", - ".accde": "application/msaccess", - ".accdr": "application/msaccess.runtime", - ".accdt": "application/msaccess", - ".accdw": "application/msaccess.webapplication", - ".accft": "application/msaccess.ftemplate", - ".acx": "application/internet-property-stream", - ".AddIn": "text/xml", - ".ade": "application/msaccess", - ".adobebridge": "application/x-bridge-url", - ".adp": "application/msaccess", - ".ADT": "audio/vnd.dlna.adts", - ".ADTS": "audio/aac", - ".afm": "application/octet-stream", - ".ai": "application/postscript", - ".aif": "audio/aiff", - ".aifc": "audio/aiff", - ".aiff": "audio/aiff", - ".air": "application/vnd.adobe.air-application-installer-package+zip", - ".amc": "application/mpeg", - ".anx": "application/annodex", - ".apk": "application/vnd.android.package-archive", - ".application": "application/x-ms-application", - ".art": "image/x-jg", - ".asa": "application/xml", - ".asax": "application/xml", - ".ascx": "application/xml", - ".asd": "application/octet-stream", - ".asf": "video/x-ms-asf", - ".ashx": "application/xml", - ".asi": "application/octet-stream", - ".asm": "text/plain", - ".asmx": "application/xml", - ".aspx": "application/xml", - ".asr": "video/x-ms-asf", - ".asx": "video/x-ms-asf", - ".atom": "application/atom+xml", - ".au": "audio/basic", - ".avi": "video/x-msvideo", - ".axa": "audio/annodex", - ".axs": "application/olescript", - ".axv": "video/annodex", - ".bas": "text/plain", - ".bcpio": "application/x-bcpio", - ".bin": "application/octet-stream", - ".bmp": "image/bmp", - ".c": "text/plain", - ".cab": "application/octet-stream", - ".caf": "audio/x-caf", - ".calx": "application/vnd.ms-office.calx", - ".cat": "application/vnd.ms-pki.seccat", - ".cc": "text/plain", - ".cd": "text/plain", - ".cdda": "audio/aiff", - ".cdf": "application/x-cdf", - ".cer": "application/x-x509-ca-cert", - ".cfg": "text/plain", - ".chm": "application/octet-stream", - ".class": "application/x-java-applet", - ".clp": "application/x-msclip", - ".cmd": "text/plain", - ".cmx": "image/x-cmx", - ".cnf": "text/plain", - ".cod": "image/cis-cod", - ".config": "application/xml", - ".contact": "text/x-ms-contact", - ".coverage": "application/xml", - ".cpio": "application/x-cpio", - ".cpp": "text/plain", - ".crd": "application/x-mscardfile", - ".crl": "application/pkix-crl", - ".crt": "application/x-x509-ca-cert", - ".cs": "text/plain", - ".csdproj": "text/plain", - ".csh": "application/x-csh", - ".csproj": "text/plain", - ".css": "text/css", - ".csv": "text/csv", - ".cur": "application/octet-stream", - ".cxx": "text/plain", - ".dat": "application/octet-stream", - ".datasource": "application/xml", - ".dbproj": "text/plain", - ".dcr": "application/x-director", - ".def": "text/plain", - ".deploy": "application/octet-stream", - ".der": "application/x-x509-ca-cert", - ".dgml": "application/xml", - ".dib": "image/bmp", - ".dif": "video/x-dv", - ".dir": "application/x-director", - ".disco": "text/xml", - ".divx": "video/divx", - ".dll": "application/x-msdownload", - ".dll.config": "text/xml", - ".dlm": "text/dlm", - ".doc": "application/msword", - ".docm": "application/vnd.ms-word.document.macroEnabled.12", - ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - ".dot": "application/msword", - ".dotm": "application/vnd.ms-word.template.macroEnabled.12", - ".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template", - ".dsp": "application/octet-stream", - ".dsw": "text/plain", - ".dtd": "text/xml", - ".dtsConfig": "text/xml", - ".dv": "video/x-dv", - ".dvi": "application/x-dvi", - ".dwf": "drawing/x-dwf", - ".dwg": "application/acad", - ".dwp": "application/octet-stream", - ".dxf": "application/x-dxf", - ".dxr": "application/x-director", - ".eml": "message/rfc822", - ".emz": "application/octet-stream", - ".eot": "application/vnd.ms-fontobject", - ".eps": "application/postscript", - ".etl": "application/etl", - ".etx": "text/x-setext", - ".evy": "application/envoy", - ".exe": "application/octet-stream", - ".exe.config": "text/xml", - ".fdf": "application/vnd.fdf", - ".fif": "application/fractals", - ".filters": "application/xml", - ".fla": "application/octet-stream", - ".flac": "audio/flac", - ".flr": "x-world/x-vrml", - ".flv": "video/x-flv", - ".fsscript": "application/fsharp-script", - ".fsx": "application/fsharp-script", - ".generictest": "application/xml", - ".gif": "image/gif", - ".gpx": "application/gpx+xml", - ".group": "text/x-ms-group", - ".gsm": "audio/x-gsm", - ".gtar": "application/x-gtar", - ".gz": "application/x-gzip", - ".h": "text/plain", - ".hdf": "application/x-hdf", - ".hdml": "text/x-hdml", - ".hhc": "application/x-oleobject", - ".hhk": "application/octet-stream", - ".hhp": "application/octet-stream", - ".hlp": "application/winhlp", - ".hpp": "text/plain", - ".hqx": "application/mac-binhex40", - ".hta": "application/hta", - ".htc": "text/x-component", - ".htm": "text/html", - ".html": "text/html", - ".htt": "text/webviewhtml", - ".hxa": "application/xml", - ".hxc": "application/xml", - ".hxd": "application/octet-stream", - ".hxe": "application/xml", - ".hxf": "application/xml", - ".hxh": "application/octet-stream", - ".hxi": "application/octet-stream", - ".hxk": "application/xml", - ".hxq": "application/octet-stream", - ".hxr": "application/octet-stream", - ".hxs": "application/octet-stream", - ".hxt": "text/html", - ".hxv": "application/xml", - ".hxw": "application/octet-stream", - ".hxx": "text/plain", - ".i": "text/plain", - ".ico": "image/x-icon", - ".ics": "application/octet-stream", - ".idl": "text/plain", - ".ief": "image/ief", - ".iii": "application/x-iphone", - ".inc": "text/plain", - ".inf": "application/octet-stream", - ".ini": "text/plain", - ".inl": "text/plain", - ".ins": "application/x-internet-signup", - ".ipa": "application/x-itunes-ipa", - ".ipg": "application/x-itunes-ipg", - ".ipproj": "text/plain", - ".ipsw": "application/x-itunes-ipsw", - ".iqy": "text/x-ms-iqy", - ".isp": "application/x-internet-signup", - ".ite": "application/x-itunes-ite", - ".itlp": "application/x-itunes-itlp", - ".itms": "application/x-itunes-itms", - ".itpc": "application/x-itunes-itpc", - ".IVF": "video/x-ivf", - ".jar": "application/java-archive", - ".java": "application/octet-stream", - ".jck": "application/liquidmotion", - ".jcz": "application/liquidmotion", - ".jfif": "image/pjpeg", - ".jnlp": "application/x-java-jnlp-file", - ".jpb": "application/octet-stream", - ".jpe": "image/jpeg", - ".jpeg": "image/jpeg", - ".jpg": "image/jpeg", - ".js": "application/javascript", - ".json": "application/json", - ".jsx": "text/jscript", - ".jsxbin": "text/plain", - ".latex": "application/x-latex", - ".library-ms": "application/windows-library+xml", - ".lit": "application/x-ms-reader", - ".loadtest": "application/xml", - ".lpk": "application/octet-stream", - ".lsf": "video/x-la-asf", - ".lst": "text/plain", - ".lsx": "video/x-la-asf", - ".lzh": "application/octet-stream", - ".m13": "application/x-msmediaview", - ".m14": "application/x-msmediaview", - ".m1v": "video/mpeg", - ".m2t": "video/vnd.dlna.mpeg-tts", - ".m2ts": "video/vnd.dlna.mpeg-tts", - ".m2v": "video/mpeg", - ".m3u": "audio/x-mpegurl", - ".m3u8": "audio/x-mpegurl", - ".m4a": "audio/m4a", - ".m4b": "audio/m4b", - ".m4p": "audio/m4p", - ".m4r": "audio/x-m4r", - ".m4v": "video/x-m4v", - ".mac": "image/x-macpaint", - ".mak": "text/plain", - ".man": "application/x-troff-man", - ".manifest": "application/x-ms-manifest", - ".map": "text/plain", - ".master": "application/xml", - ".mbox": "application/mbox", - ".mda": "application/msaccess", - ".mdb": "application/x-msaccess", - ".mde": "application/msaccess", - ".mdp": "application/octet-stream", - ".me": "application/x-troff-me", - ".mfp": "application/x-shockwave-flash", - ".mht": "message/rfc822", - ".mhtml": "message/rfc822", - ".mid": "audio/mid", - ".midi": "audio/mid", - ".mix": "application/octet-stream", - ".mk": "text/plain", - ".mmf": "application/x-smaf", - ".mno": "text/xml", - ".mny": "application/x-msmoney", - ".mod": "video/mpeg", - ".mov": "video/quicktime", - ".movie": "video/x-sgi-movie", - ".mp2": "video/mpeg", - ".mp2v": "video/mpeg", - ".mp3": "audio/mpeg", - ".mp4": "video/mp4", - ".mp4v": "video/mp4", - ".mpa": "video/mpeg", - ".mpe": "video/mpeg", - ".mpeg": "video/mpeg", - ".mpf": "application/vnd.ms-mediapackage", - ".mpg": "video/mpeg", - ".mpp": "application/vnd.ms-project", - ".mpv2": "video/mpeg", - ".mqv": "video/quicktime", - ".ms": "application/x-troff-ms", - ".msg": "application/vnd.ms-outlook", - ".msi": "application/octet-stream", - ".mso": "application/octet-stream", - ".mts": "video/vnd.dlna.mpeg-tts", - ".mtx": "application/xml", - ".mvb": "application/x-msmediaview", - ".mvc": "application/x-miva-compiled", - ".mxp": "application/x-mmxp", - ".nc": "application/x-netcdf", - ".nsc": "video/x-ms-asf", - ".nws": "message/rfc822", - ".ocx": "application/octet-stream", - ".oda": "application/oda", - ".odb": "application/vnd.oasis.opendocument.database", - ".odc": "application/vnd.oasis.opendocument.chart", - ".odf": "application/vnd.oasis.opendocument.formula", - ".odg": "application/vnd.oasis.opendocument.graphics", - ".odh": "text/plain", - ".odi": "application/vnd.oasis.opendocument.image", - ".odl": "text/plain", - ".odm": "application/vnd.oasis.opendocument.text-master", - ".odp": "application/vnd.oasis.opendocument.presentation", - ".ods": "application/vnd.oasis.opendocument.spreadsheet", - ".odt": "application/vnd.oasis.opendocument.text", - ".oga": "audio/ogg", - ".ogg": "audio/ogg", - ".ogv": "video/ogg", - ".ogx": "application/ogg", - ".one": "application/onenote", - ".onea": "application/onenote", - ".onepkg": "application/onenote", - ".onetmp": "application/onenote", - ".onetoc": "application/onenote", - ".onetoc2": "application/onenote", - ".opus": "audio/ogg", - ".orderedtest": "application/xml", - ".osdx": "application/opensearchdescription+xml", - ".otf": "application/font-sfnt", - ".otg": "application/vnd.oasis.opendocument.graphics-template", - ".oth": "application/vnd.oasis.opendocument.text-web", - ".otp": "application/vnd.oasis.opendocument.presentation-template", - ".ots": "application/vnd.oasis.opendocument.spreadsheet-template", - ".ott": "application/vnd.oasis.opendocument.text-template", - ".oxt": "application/vnd.openofficeorg.extension", - ".p10": "application/pkcs10", - ".p12": "application/x-pkcs12", - ".p7b": "application/x-pkcs7-certificates", - ".p7c": "application/pkcs7-mime", - ".p7m": "application/pkcs7-mime", - ".p7r": "application/x-pkcs7-certreqresp", - ".p7s": "application/pkcs7-signature", - ".pbm": "image/x-portable-bitmap", - ".pcast": "application/x-podcast", - ".pct": "image/pict", - ".pcx": "application/octet-stream", - ".pcz": "application/octet-stream", - ".pdf": "application/pdf", - ".pfb": "application/octet-stream", - ".pfm": "application/octet-stream", - ".pfx": "application/x-pkcs12", - ".pgm": "image/x-portable-graymap", - ".pic": "image/pict", - ".pict": "image/pict", - ".pkgdef": "text/plain", - ".pkgundef": "text/plain", - ".pko": "application/vnd.ms-pki.pko", - ".pls": "audio/scpls", - ".pma": "application/x-perfmon", - ".pmc": "application/x-perfmon", - ".pml": "application/x-perfmon", - ".pmr": "application/x-perfmon", - ".pmw": "application/x-perfmon", - ".png": "image/png", - ".pnm": "image/x-portable-anymap", - ".pnt": "image/x-macpaint", - ".pntg": "image/x-macpaint", - ".pnz": "image/png", - ".pot": "application/vnd.ms-powerpoint", - ".potm": "application/vnd.ms-powerpoint.template.macroEnabled.12", - ".potx": "application/vnd.openxmlformats-officedocument.presentationml.template", - ".ppa": "application/vnd.ms-powerpoint", - ".ppam": "application/vnd.ms-powerpoint.addin.macroEnabled.12", - ".ppm": "image/x-portable-pixmap", - ".pps": "application/vnd.ms-powerpoint", - ".ppsm": "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", - ".ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow", - ".ppt": "application/vnd.ms-powerpoint", - ".pptm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12", - ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", - ".prf": "application/pics-rules", - ".prm": "application/octet-stream", - ".prx": "application/octet-stream", - ".ps": "application/postscript", - ".psc1": "application/PowerShell", - ".psd": "application/octet-stream", - ".psess": "application/xml", - ".psm": "application/octet-stream", - ".psp": "application/octet-stream", - ".pst": "application/vnd.ms-outlook", - ".pub": "application/x-mspublisher", - ".pwz": "application/vnd.ms-powerpoint", - ".qht": "text/x-html-insertion", - ".qhtm": "text/x-html-insertion", - ".qt": "video/quicktime", - ".qti": "image/x-quicktime", - ".qtif": "image/x-quicktime", - ".qtl": "application/x-quicktimeplayer", - ".qxd": "application/octet-stream", - ".ra": "audio/x-pn-realaudio", - ".ram": "audio/x-pn-realaudio", - ".rar": "application/x-rar-compressed", - ".ras": "image/x-cmu-raster", - ".rat": "application/rat-file", - ".rc": "text/plain", - ".rc2": "text/plain", - ".rct": "text/plain", - ".rdlc": "application/xml", - ".reg": "text/plain", - ".resx": "application/xml", - ".rf": "image/vnd.rn-realflash", - ".rgb": "image/x-rgb", - ".rgs": "text/plain", - ".rm": "application/vnd.rn-realmedia", - ".rmi": "audio/mid", - ".rmp": "application/vnd.rn-rn_music_package", - ".roff": "application/x-troff", - ".rpm": "audio/x-pn-realaudio-plugin", - ".rqy": "text/x-ms-rqy", - ".rtf": "application/rtf", - ".rtx": "text/richtext", - ".rvt": "application/octet-stream", - ".ruleset": "application/xml", - ".s": "text/plain", - ".safariextz": "application/x-safari-safariextz", - ".scd": "application/x-msschedule", - ".scr": "text/plain", - ".sct": "text/scriptlet", - ".sd2": "audio/x-sd2", - ".sdp": "application/sdp", - ".sea": "application/octet-stream", - ".searchConnector-ms": "application/windows-search-connector+xml", - ".setpay": "application/set-payment-initiation", - ".setreg": "application/set-registration-initiation", - ".settings": "application/xml", - ".sgimb": "application/x-sgimb", - ".sgml": "text/sgml", - ".sh": "application/x-sh", - ".shar": "application/x-shar", - ".shtml": "text/html", - ".sit": "application/x-stuffit", - ".sitemap": "application/xml", - ".skin": "application/xml", - ".skp": "application/x-koan", - ".sldm": "application/vnd.ms-powerpoint.slide.macroEnabled.12", - ".sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide", - ".slk": "application/vnd.ms-excel", - ".sln": "text/plain", - ".slupkg-ms": "application/x-ms-license", - ".smd": "audio/x-smd", - ".smi": "application/octet-stream", - ".smx": "audio/x-smd", - ".smz": "audio/x-smd", - ".snd": "audio/basic", - ".snippet": "application/xml", - ".snp": "application/octet-stream", - ".sol": "text/plain", - ".sor": "text/plain", - ".spc": "application/x-pkcs7-certificates", - ".spl": "application/futuresplash", - ".spx": "audio/ogg", - ".src": "application/x-wais-source", - ".srf": "text/plain", - ".SSISDeploymentManifest": "text/xml", - ".ssm": "application/streamingmedia", - ".sst": "application/vnd.ms-pki.certstore", - ".stl": "application/vnd.ms-pki.stl", - ".sv4cpio": "application/x-sv4cpio", - ".sv4crc": "application/x-sv4crc", - ".svc": "application/xml", - ".svg": "image/svg+xml", - ".swf": "application/x-shockwave-flash", - ".step": "application/step", - ".stp": "application/step", - ".t": "application/x-troff", - ".tar": "application/x-tar", - ".tcl": "application/x-tcl", - ".testrunconfig": "application/xml", - ".testsettings": "application/xml", - ".tex": "application/x-tex", - ".texi": "application/x-texinfo", - ".texinfo": "application/x-texinfo", - ".tgz": "application/x-compressed", - ".thmx": "application/vnd.ms-officetheme", - ".thn": "application/octet-stream", - ".tif": "image/tiff", - ".tiff": "image/tiff", - ".tlh": "text/plain", - ".tli": "text/plain", - ".toc": "application/octet-stream", - ".tr": "application/x-troff", - ".trm": "application/x-msterminal", - ".trx": "application/xml", - ".ts": "video/vnd.dlna.mpeg-tts", - ".tsv": "text/tab-separated-values", - ".ttf": "application/font-sfnt", - ".tts": "video/vnd.dlna.mpeg-tts", - ".txt": "text/plain", - ".u32": "application/octet-stream", - ".uls": "text/iuls", - ".user": "text/plain", - ".ustar": "application/x-ustar", - ".vb": "text/plain", - ".vbdproj": "text/plain", - ".vbk": "video/mpeg", - ".vbproj": "text/plain", - ".vbs": "text/vbscript", - ".vcf": "text/x-vcard", - ".vcproj": "application/xml", - ".vcs": "text/plain", - ".vcxproj": "application/xml", - ".vddproj": "text/plain", - ".vdp": "text/plain", - ".vdproj": "text/plain", - ".vdx": "application/vnd.ms-visio.viewer", - ".vml": "text/xml", - ".vscontent": "application/xml", - ".vsct": "text/xml", - ".vsd": "application/vnd.visio", - ".vsi": "application/ms-vsi", - ".vsix": "application/vsix", - ".vsixlangpack": "text/xml", - ".vsixmanifest": "text/xml", - ".vsmdi": "application/xml", - ".vspscc": "text/plain", - ".vss": "application/vnd.visio", - ".vsscc": "text/plain", - ".vssettings": "text/xml", - ".vssscc": "text/plain", - ".vst": "application/vnd.visio", - ".vstemplate": "text/xml", - ".vsto": "application/x-ms-vsto", - ".vsw": "application/vnd.visio", - ".vsx": "application/vnd.visio", - ".vtx": "application/vnd.visio", - ".wav": "audio/wav", - ".wave": "audio/wav", - ".wax": "audio/x-ms-wax", - ".wbk": "application/msword", - ".wbmp": "image/vnd.wap.wbmp", - ".wcm": "application/vnd.ms-works", - ".wdb": "application/vnd.ms-works", - ".wdp": "image/vnd.ms-photo", - ".webarchive": "application/x-safari-webarchive", - ".webm": "video/webm", - ".webp": "image/webp", /* https"://en.wikipedia.org/wiki/WebP */ - ".webtest": "application/xml", - ".wiq": "application/xml", - ".wiz": "application/msword", - ".wks": "application/vnd.ms-works", - ".WLMP": "application/wlmoviemaker", - ".wlpginstall": "application/x-wlpg-detect", - ".wlpginstall3": "application/x-wlpg3-detect", - ".wm": "video/x-ms-wm", - ".wma": "audio/x-ms-wma", - ".wmd": "application/x-ms-wmd", - ".wmf": "application/x-msmetafile", - ".wml": "text/vnd.wap.wml", - ".wmlc": "application/vnd.wap.wmlc", - ".wmls": "text/vnd.wap.wmlscript", - ".wmlsc": "application/vnd.wap.wmlscriptc", - ".wmp": "video/x-ms-wmp", - ".wmv": "video/x-ms-wmv", - ".wmx": "video/x-ms-wmx", - ".wmz": "application/x-ms-wmz", - ".woff": "application/font-woff", - ".wpl": "application/vnd.ms-wpl", - ".wps": "application/vnd.ms-works", - ".wri": "application/x-mswrite", - ".wrl": "x-world/x-vrml", - ".wrz": "x-world/x-vrml", - ".wsc": "text/scriptlet", - ".wsdl": "text/xml", - ".wvx": "video/x-ms-wvx", - ".x": "application/directx", - ".xaf": "x-world/x-vrml", - ".xaml": "application/xaml+xml", - ".xap": "application/x-silverlight-app", - ".xbap": "application/x-ms-xbap", - ".xbm": "image/x-xbitmap", - ".xdr": "text/plain", - ".xht": "application/xhtml+xml", - ".xhtml": "application/xhtml+xml", - ".xla": "application/vnd.ms-excel", - ".xlam": "application/vnd.ms-excel.addin.macroEnabled.12", - ".xlc": "application/vnd.ms-excel", - ".xld": "application/vnd.ms-excel", - ".xlk": "application/vnd.ms-excel", - ".xll": "application/vnd.ms-excel", - ".xlm": "application/vnd.ms-excel", - ".xls": "application/vnd.ms-excel", - ".xlsb": "application/vnd.ms-excel.sheet.binary.macroEnabled.12", - ".xlsm": "application/vnd.ms-excel.sheet.macroEnabled.12", - ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ".xlt": "application/vnd.ms-excel", - ".xltm": "application/vnd.ms-excel.template.macroEnabled.12", - ".xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template", - ".xlw": "application/vnd.ms-excel", - ".xml": "text/xml", - ".xmp": "application/octet-stream", - ".xmta": "application/xml", - ".xof": "x-world/x-vrml", - ".XOML": "text/plain", - ".xpm": "image/x-xpixmap", - ".xps": "application/vnd.ms-xpsdocument", - ".xrm-ms": "text/xml", - ".xsc": "application/xml", - ".xsd": "text/xml", - ".xsf": "text/xml", - ".xsl": "text/xml", - ".xslt": "text/xml", - ".xsn": "application/octet-stream", - ".xss": "application/xml", - ".xspf": "application/xspf+xml", - ".xtp": "application/octet-stream", - ".xwd": "image/x-xwindowdump", - ".z": "application/x-compress", - ".zip": "application/zip"} - - if mimeType, ok := mimeMap[extension]; ok { + if mimeType, ok := allMimeMap[extension]; ok { return mimeType } else { return "application/octet-stream" } } + +//根据一个后缀名获取MimeType,获取不到默认返回fallback. +func GetFallbackMimeType(filename string, fallback string) string { + + extension := GetExtension(filename) + + if mimeType, ok := allMimeMap[extension]; ok { + return mimeType + } else { + return fallback + } +}