参考官网安装minio
# https://min.io/docs/minio/container/index.html
mkdir -p ~/minio/data
docker run \
-p 9000:9000 \
-p 9090:9090 \
--name minio \
-v ~/minio/data:/data \
-e "MINIO_ROOT_USER=ROOTNAME" \
-e "MINIO_ROOT_PASSWORD=CHANGEME123" \
quay.io/minio/minio server /data --console-address ":9090"
#或者使用我的镜像,默认用户密码看日志即可
docker run -d --name minio -p 9000:9000 -p 9001:9001 registry.cn-shenzhen.aliyuncs.com/jbjb/csi:mino server /data --console-address ":9001"
-
golang代码
-
(该代码使用 log 包记录错误日志,并在出现错误时返回适当的 HTTP 状态码和消息,以便客户端显示相应的提示信息。同时,添加了一个处理静态文件请求的处理器,并将前端页面文件放在 ./static/ 目录下。)
package main
import (
"fmt"
"net/http"
"net/url"
"log"
"strings"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
const (
endpoint = "172.17.0.2:9000"
accessKeyID = "minioadmin"
secretAccessKey = "minioadmin"
useSSL = false
bucketName = "jsj"
)
func main() {
// 初始化 MinIO 客户端对象
minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
panic(err)
}
// 处理文件上传请求
http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
// 获取上传的文件
file, header, err := r.FormFile("file")
if err != nil {
log.Printf("get form err: %s", err.Error()) // 记录错误日志
http.Error(w, "Bad Request", http.StatusBadRequest)
return
}
defer file.Close()
// 将文件上传到 MinIO 中
objectName := header.Filename
contentType := "application/octet-stream"
objectName = strings.ReplaceAll(objectName, "@", "_") // 替换 @ 符号
encodedObjectName := url.QueryEscape(objectName)
n, err := minioClient.PutObject(r.Context(), bucketName, encodedObjectName, file, -1, minio.PutObjectOptions{ContentType: contentType})
if err != nil {
log.Printf("upload file err: %s", err.Error()) // 记录错误日志
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "File uploaded (%d bytes)", n)
})
// 处理静态文件请求
staticHandler := http.FileServer(http.Dir("./static"))
http.Handle("/", staticHandler)
// 启动 HTTP 服务器
fmt.Println("Starting server on port :8080")
http.ListenAndServe(":8080", nil)
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Upload a file</title>
</head>
<body>
<h1>Upload a file</h1>
<form id="upload-form" enctype="multipart/form-data">
<input type="file" name="file"><br><br>
<button type="submit">Upload</button>
</form>
<div id="message"></div>
<script>
// 获取表单元素和提示信息元素
var form = document.getElementById('upload-form');
var message = document.getElementById('message');
// 监听提交事件,使用 AJAX 发送文件上传请求
form.addEventListener('submit', function(event) {
event.preventDefault(); // 阻止表单默认提交行为
var xhr = new XMLHttpRequest();
xhr.open('POST', '/upload');
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
message.textContent = 'File uploaded successfully.';
} else {
message.textContent = 'File upload failed: ' + xhr.statusText;
}
}
};
xhr.onerror = function() {
message.textContent = 'File upload failed. Please check your internet connection and try again.';
};
var formData = new FormData();
formData.append('file', form.file.files[0], encodeURIComponent(form.file.files[0].name));
xhr.send(formData);
});
</script>
</body>
</html>
最后运行
go mod init xxxx
go mod tidy
go run xxx.go