package admin import ( "encoding/base64" "io" "os" "path/filepath" "github.com/gin-gonic/gin" "github.com/lejianwen/rustdesk-api/v2/global" "github.com/lejianwen/rustdesk-api/v2/http/response" "github.com/lejianwen/rustdesk-api/v2/service" ) // UploadConfigFile загружает конфигурационный файл для использования в генерации клиента // @Tags 客户端编译 // @Summary 上传配置文件 // @Description 上传自定义配置文件(无限制,任何文件都可以上传) // @Accept multipart/form-data // @Produce json // @Param file formData file true "配置文件" // @Success 200 {object} response.Response{data=object{file_content=string}} // @Failure 500 {object} response.Response // @Router /admin/client_build/upload_config [post] // @Security token func (ct *ClientBuild) UploadConfigFile(c *gin.Context) { u := service.AllService.UserService.CurUser(c) if u.Id == 0 { response.Fail(c, 101, response.TranslateMsg(c, "UserNotFound")) return } // Получаем загруженный файл file, err := c.FormFile("file") if err != nil { response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+": file is required") return } // Открываем файл src, err := file.Open() if err != nil { response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+": "+err.Error()) return } defer src.Close() // Читаем содержимое файла fileContent, err := io.ReadAll(src) if err != nil { response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+": "+err.Error()) return } // Кодируем в base64 для передачи в JSON fileContentBase64 := base64.StdEncoding.EncodeToString(fileContent) // Опционально: сохраняем файл для справки uploadDir := filepath.Join(global.Config.Gin.ResourcesPath, "uploads", "configs") if err := os.MkdirAll(uploadDir, 0755); err == nil { dst := filepath.Join(uploadDir, file.Filename) if err := c.SaveUploadedFile(file, dst); err == nil { // Файл сохранен } } response.Success(c, gin.H{ "file_name": file.Filename, "file_size": file.Size, "file_content": fileContentBase64, "message": "File uploaded successfully. Use file_content in custom_config_file field.", }) }