You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.2 KiB
85 lines
2.2 KiB
|
|
package controller
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"io/ioutil"
|
|
"crypto/rand"
|
|
"path/filepath"
|
|
"os"
|
|
"mime"
|
|
"log"
|
|
)
|
|
|
|
|
|
func (app *Application) UploadFile(w http.ResponseWriter, r *http.Request) {
|
|
|
|
start := "{"
|
|
content := ""
|
|
end := "}"
|
|
|
|
file, _, err := r.FormFile("file")
|
|
if err != nil {
|
|
content = "\"error\":1,\"result\":{\"msg\":\"指定了无效的文件\",\"path\":\"\"}"
|
|
w.Write([]byte(start + content + end))
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
fileBytes, err := ioutil.ReadAll(file)
|
|
if err != nil {
|
|
content = "\"error\":1,\"result\":{\"msg\":\"无法读取文件内容\",\"path\":\"\"}"
|
|
w.Write([]byte(start + content + end))
|
|
return
|
|
}
|
|
|
|
filetype := http.DetectContentType(fileBytes)
|
|
//log.Println("filetype = " + filetype)
|
|
switch filetype {
|
|
case "image/jpeg", "image/jpg":
|
|
case "image/gif", "image/png":
|
|
case "application/pdf":
|
|
break
|
|
default:
|
|
content = "\"error\":1,\"result\":{\"msg\":\"文件类型错误\",\"path\":\"\"}"
|
|
w.Write([]byte(start + content + end))
|
|
return
|
|
}
|
|
|
|
fileName := randToken(12) // 指定文件名
|
|
fileEndings, err := mime.ExtensionsByType(filetype) // 获取文件扩展名
|
|
//log.Println("fileEndings = " + fileEndings[0])
|
|
// 指定文件存储路径
|
|
newPath := filepath.Join("web", "static", "photo", fileName + fileEndings[0])
|
|
//fmt.Printf("FileType: %s, File: %s\n", filetype, newPath)
|
|
|
|
newFile, err := os.Create(newPath)
|
|
if err != nil {
|
|
log.Println("创建文件失败:" + err.Error())
|
|
content = "\"error\":1,\"result\":{\"msg\":\"创建文件失败\",\"path\":\"\"}"
|
|
w.Write([]byte(start + content + end))
|
|
return
|
|
}
|
|
defer newFile.Close()
|
|
|
|
if _, err := newFile.Write(fileBytes); err != nil || newFile.Close() != nil {
|
|
log.Println("写入文件失败:" + err.Error())
|
|
content = "\"error\":1,\"result\":{\"msg\":\"保存文件内容失败\",\"path\":\"\"}"
|
|
w.Write([]byte(start + content + end))
|
|
return
|
|
}
|
|
|
|
path := "/static/photo/" + fileName + fileEndings[0]
|
|
content = "\"error\":0,\"result\":{\"fileType\":\"image/png\",\"path\":\"" + path + "\",\"fileName\":\"ce73ac68d0d93de80d925b5a.png\"}"
|
|
w.Write([]byte(start + content + end))
|
|
return
|
|
}
|
|
|
|
func randToken(len int) string {
|
|
b := make([]byte, len)
|
|
rand.Read(b)
|
|
return fmt.Sprintf("%x", b)
|
|
}
|
|
|