{"id":15095855,"url":"https://github.com/neon-rainbow/gin-image-server","last_synced_at":"2026-01-06T22:43:16.777Z","repository":{"id":251939538,"uuid":"837830608","full_name":"Neon-Rainbow/gin-image-server","owner":"Neon-Rainbow","description":"A simple image upload and retrieval service built using the Gin framework. The project is containerized using Docker and Docker Compose.","archived":false,"fork":false,"pushed_at":"2024-08-06T15:22:45.000Z","size":15,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-01T17:44:17.585Z","etag":null,"topics":["docker","docker-compose","gin","golang"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Neon-Rainbow.png","metadata":{"files":{"readme":"README-zh_cn.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-04T06:53:46.000Z","updated_at":"2024-08-06T15:22:48.000Z","dependencies_parsed_at":"2024-08-06T18:14:39.068Z","dependency_job_id":null,"html_url":"https://github.com/Neon-Rainbow/gin-image-server","commit_stats":null,"previous_names":["neon-rainbow/gin-image-server"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neon-Rainbow%2Fgin-image-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neon-Rainbow%2Fgin-image-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neon-Rainbow%2Fgin-image-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neon-Rainbow%2Fgin-image-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Neon-Rainbow","download_url":"https://codeload.github.com/Neon-Rainbow/gin-image-server/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245852606,"owners_count":20683064,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","gin","golang"],"created_at":"2024-09-25T15:42:43.558Z","updated_at":"2026-01-06T22:43:16.738Z","avatar_url":"https://github.com/Neon-Rainbow.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ImageServer\n\n一个使用 Gin 框架构建的简单图片上传和获取服务。项目使用 Docker 和 Docker Compose 进行容器化部署。\n\n[English version](README.md)\n## 项目结构\n\n```\nImageServer/\n├── Dockerfile\n├── LICENSE\n├── README-zh_cn.md\n├── README.md\n├── config\n│   └── config.go\n├── config.yaml\n├── controllers\n│   └── image_controller.go\n├── docker-compose.yml\n├── go.mod\n├── go.sum\n├── main.go\n├── models\n│   └── image.go\n└── uploads\n\n\n```\n\nconfig.yaml内容:\n```yaml\nserver:\n  host: 127.0.0.1 # 服务器地址\n  port: 8080 # 服务器端口\n```\n返回的url的格式:\n```\nhttp://{host}:{post}/image/{image_name}\n```\n可以直接访问该地址来访问图片\n\n## 功能介绍\n\n- **上传图片**：将图片上传到服务器并返回存储路径。\n- **获取图片**：通过给定的图片路径获取图片。\n\n## 准备工作\n\n确保已安装以下工具：\n\n- [Docker](https://www.docker.com/get-started)\n- [Docker Compose](https://docs.docker.com/compose/install/)\n\n## 快速开始\n\n### 1. 克隆仓库\n\n\n### 2. 构建并启动服务\n\n使用 Docker Compose 构建并启动服务：\n\n```sh\ndocker-compose up --build\n```\n\n服务将会在 `http://localhost:8080` 运行。\n\n### 3. 上传图片\n\n使用 `curl` 命令上传图片：\n\n```sh\ncurl -X POST http://localhost:8080/upload -F \"image=@/path/to/your/image.jpg\"\n```\n\n成功上传后，服务器将返回图片的存储路径。\n\n### 4. 获取图片\n\n使用 `curl` 命令获取图片：\n\n```sh\ncurl http://localhost:8080/image/your_image_filename.jpg --output downloaded_image.jpg\n```\n\n## 代码说明\n\n### `main.go`\n\n设置路由和启动 Gin 服务。\n\n```go\npackage main\n\nimport (\n    \"github.com/gin-gonic/gin\"\n    \"ImageServer/controllers\"\n)\n\nfunc main() {\n    router := gin.Default()\n\n    // 创建用于存储上传图片的目录\n    router.Static(\"/uploads\", \"./uploads\")\n\n    // 上传图片接口\n    router.POST(\"/upload\", controllers.UploadImage)\n\n    // 获取图片接口\n    router.GET(\"/image/:filename\", controllers.GetImage)\n\n    router.Run(\":8080\")\n}\n```\n\n### `controllers/image_controller.go`\n\n处理图片上传和获取的控制器。\n\n```go\npackage controllers\n\nimport (\n    \"github.com/gin-gonic/gin\"\n    \"github.com/google/uuid\"\n    \"net/http\"\n    \"path/filepath\"\n    \"fmt\"\n    \"os\"\n)\n\n// UploadImage 处理图片上传\nfunc UploadImage(c *gin.Context) {\n    file, err := c.FormFile(\"image\")\n    if err != nil {\n        c.JSON(http.StatusBadRequest, gin.H{\n            \"error\": \"Failed to upload image\",\n        })\n        return\n    }\n\n    // 获取文件扩展名\n    ext := filepath.Ext(file.Filename)\n    // 生成新的文件名\n    newFileName := fmt.Sprintf(\"%s%s\", uuid.New().String(), ext)\n    // 创建文件存储路径\n    filePath := filepath.Join(\"uploads\", newFileName)\n\n    // 创建uploads目录\n    if err := os.MkdirAll(\"uploads\", os.ModePerm); err != nil {\n        c.JSON(http.StatusInternalServerError, gin.H{\n            \"error\": \"Failed to create uploads directory\",\n        })\n        return\n    }\n\n    // 保存图片\n    if err := c.SaveUploadedFile(file, filePath); err != nil {\n        c.JSON(http.StatusInternalServerError, gin.H{\n            \"error\": \"Failed to save image\",\n        })\n        return\n    }\n\n    // 返回图片存储路径\n    c.JSON(http.StatusOK, gin.H{\n        \"message\": \"Image uploaded successfully\",\n        \"filepath\": filePath,\n    })\n}\n\n// GetImage 处理图片获取\nfunc GetImage(c *gin.Context) {\n    filename := c.Param(\"filename\")\n    filePath := filepath.Join(\"uploads\", filename)\n\n    // 检查图片是否存在\n    if _, err := os.Stat(filePath); os.IsNotExist(err) {\n        c.JSON(http.StatusNotFound, gin.H{\n            \"error\": \"Image not found\",\n        })\n        return\n    }\n\n    // 返回图片\n    c.File(filePath)\n}\n```\n\n### `models/image.go`\n\n图片模型定义及文件检查方法。\n\n```go\npackage models\n\nimport (\n    \"os\"\n)\n\n// Image 图片模型\ntype Image struct {\n    Filename string `json:\"filename\"`\n    Filepath string `json:\"filepath\"`\n}\n\n// GetImage 检查图片是否存在\nfunc GetImage(filepath string) (*Image, error) {\n    if _, err := os.Stat(filepath); os.IsNotExist(err) {\n        return nil, err\n    }\n    return \u0026Image{\n        Filepath: filepath,\n    }, nil\n}\n```\n\n### `Dockerfile`\n\n用于构建 Docker 镜像的文件。\n\n```Dockerfile\n# 使用官方的 Golang 镜像作为基础镜像\nFROM golang:1.20-alpine\n\n# 设置工作目录\nWORKDIR /app\n\n# 复制 go.mod 和 go.sum 并下载依赖\nCOPY go.mod go.sum ./\nRUN go mod download\n\n# 复制项目的源代码\nCOPY . .\n\n# 构建 Go 应用\nRUN go build -o main .\n\n# 暴露应用运行的端口\nEXPOSE 8080\n\n# 运行 Go 应用\nCMD [\"./main\"]\n```\n\n### `docker-compose.yml`\n\n用于定义和运行多容器 Docker 应用的配置文件。\n\n```yaml\nversion: '3.8'\n\nservices:\n  imageserver:\n    build: .\n    ports:\n      - \"8080:8080\"\n    volumes:\n      - ./uploads:/app/uploads\n```\n\n## 持久化存储\n\n使用 Docker Compose 中的 `volumes` 配置，确保上传的文件会保存在主机的 `uploads` 目录中，即使容器被删除或重启，文件数据仍然会保留。\n\n## 贡献\n\n欢迎提交问题和合并请求。如果你有任何建议或发现任何问题，请创建 Issue 或提交 Pull Request。\n\n## 许可证\n\n该项目使用 MIT 许可证。详情请参见 [LICENSE](LICENSE) 文件。\n```\n\n这个 `README.md` 文件包含了项目的简介、功能介绍、快速开始指南、代码说明、以及贡献和许可证信息，能够帮助用户快速了解和使用你的项目。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneon-rainbow%2Fgin-image-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneon-rainbow%2Fgin-image-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneon-rainbow%2Fgin-image-server/lists"}