dataset 上传文件
This commit is contained in:
		@@ -2,11 +2,14 @@ package routers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"main/configs"
 | 
			
		||||
	"main/models"
 | 
			
		||||
	"main/utils"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
)
 | 
			
		||||
@@ -60,6 +63,81 @@ func DatasetsPost(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 上传图片文件
 | 
			
		||||
func DatasetsUpload(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	models.AccountRead(w, r, func(account *models.Account) {
 | 
			
		||||
		// 獲取數據集
 | 
			
		||||
		dataset := models.Dataset{ID: utils.ParamInt(mux.Vars(r)["dataset_id"], 0)}
 | 
			
		||||
		if err := configs.ORMDB().Find(&dataset).Error; err != nil {
 | 
			
		||||
			w.WriteHeader(http.StatusNotFound)
 | 
			
		||||
			w.Write([]byte("404 - Not Found"))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		// 只能修改自己的數據集, 除非是管理員
 | 
			
		||||
		if dataset.UserID != account.ID && !account.Admin {
 | 
			
		||||
			w.WriteHeader(http.StatusForbidden)
 | 
			
		||||
			w.Write([]byte("403 - Forbidden"))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		// 解析 HTTP 请求中的多个文件 (限制上传文件的大小为 32MB)
 | 
			
		||||
		if err := r.ParseMultipartForm(32 << 20); err != nil {
 | 
			
		||||
			http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		// 遍历所有上传的文件
 | 
			
		||||
		for _, fileHeaders := range r.MultipartForm.File {
 | 
			
		||||
			for _, fileHeader := range fileHeaders {
 | 
			
		||||
				// 打开上传的文件
 | 
			
		||||
				file, err := fileHeader.Open()
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				defer file.Close()
 | 
			
		||||
 | 
			
		||||
				// 在本地文件夹中创建一个新文件
 | 
			
		||||
				localFile, err := os.Create(fmt.Sprintf("data/dataset/%d/%s", dataset.ID, fileHeader.Filename))
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				defer localFile.Close()
 | 
			
		||||
 | 
			
		||||
				// 将上传文件的内容复制到本地文件
 | 
			
		||||
				_, err = io.Copy(localFile, file)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// 将文件名添加到數據集中
 | 
			
		||||
				dataset.Images = append(dataset.Images, fileHeader.Filename)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 去除重复项
 | 
			
		||||
		uniqueImages := make(map[string]bool)
 | 
			
		||||
		for _, image := range dataset.Images {
 | 
			
		||||
			uniqueImages[image] = true
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 转换为切片
 | 
			
		||||
		dataset.Images = []string{}
 | 
			
		||||
		for image := range uniqueImages {
 | 
			
		||||
			dataset.Images = append(dataset.Images, image)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 保存數據集
 | 
			
		||||
		if err := configs.ORMDB().Save(&dataset).Error; err != nil {
 | 
			
		||||
			w.WriteHeader(http.StatusInternalServerError)
 | 
			
		||||
			w.Write([]byte("500 - Internal Server Error"))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		w.Header().Set("Content-Type", "application/json; charset=utf-8")
 | 
			
		||||
		w.Write(utils.ToJSON(dataset))
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 獲取數據集
 | 
			
		||||
func DatasetsItemGet(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	dataset := models.Dataset{ID: utils.ParamInt(mux.Vars(r)["dataset_id"], 0)}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user