手動上傳圖片文件
This commit is contained in:
		@@ -1,13 +1,21 @@
 | 
			
		||||
package routers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/md5"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"image"
 | 
			
		||||
	_ "image/gif"
 | 
			
		||||
	_ "image/jpeg"
 | 
			
		||||
	_ "image/png"
 | 
			
		||||
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"log"
 | 
			
		||||
	"main/configs"
 | 
			
		||||
	"main/models"
 | 
			
		||||
	"main/utils"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
)
 | 
			
		||||
@@ -31,23 +39,69 @@ func ImagesGet(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ImagesPost(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	var image models.Image
 | 
			
		||||
	body, err := ioutil.ReadAll(r.Body)
 | 
			
		||||
	// 接收上傳的圖片文件, 僅限一張
 | 
			
		||||
	file, file_header, err := r.FormFile("file")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer r.Body.Close()
 | 
			
		||||
	if err = json.Unmarshal(body, &image); err != nil {
 | 
			
		||||
	defer file.Close()
 | 
			
		||||
 | 
			
		||||
	// 圖片寬高
 | 
			
		||||
	imgData, format, err := image.Decode(file)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if err := configs.ORMDB().Create(&image).Error; err != nil {
 | 
			
		||||
 | 
			
		||||
	fmt.Println(format, imgData.Bounds().Dx(), imgData.Bounds().Dy())
 | 
			
		||||
 | 
			
		||||
	// 將文件指針移回開頭
 | 
			
		||||
	if _, err := file.Seek(0, 0); err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 读取文件内容
 | 
			
		||||
	content, err := ioutil.ReadAll(file)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 整理文件信息
 | 
			
		||||
	var img models.Image
 | 
			
		||||
	img.Name = file_header.Filename
 | 
			
		||||
	img.Size = int(file_header.Size)                              // 數據大小
 | 
			
		||||
	img.Hash = fmt.Sprintf("%x", md5.Sum(content))                // 计算哈希
 | 
			
		||||
	img.Type = file_header.Header.Get("Content-Type")             // 文件類型
 | 
			
		||||
	img.Path = fmt.Sprintf("data/images/%s.%s", img.Hash, format) // 存儲路徑
 | 
			
		||||
	img.Width = imgData.Bounds().Dx()
 | 
			
		||||
	img.Height = imgData.Bounds().Dy()
 | 
			
		||||
	img.Format = format
 | 
			
		||||
 | 
			
		||||
	// 先檢查 data/images 目錄是否存在
 | 
			
		||||
	if _, err := ioutil.ReadDir("data/images"); err != nil {
 | 
			
		||||
		if err := os.Mkdir("data/images", 0777); err != nil {
 | 
			
		||||
			log.Println(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 將文件存儲到本地 data/images 目錄下
 | 
			
		||||
	if err := ioutil.WriteFile(img.Path, content, 0666); err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 存儲圖片信息到數據庫
 | 
			
		||||
	if err := configs.ORMDB().Create(&img).Error; err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 | 
			
		||||
	w.Write(utils.ToJSON(image))
 | 
			
		||||
	w.Write(utils.ToJSON(img))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ImagesItemGet(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user