You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
1.9 KiB
113 lines
1.9 KiB
package objstorage
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"path"
|
|
"time"
|
|
)
|
|
|
|
func HttpPut(url string, body io.Reader) error {
|
|
req, err := http.NewRequest(http.MethodPut, url, body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
client := http.Client{}
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
data, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if resp.StatusCode != http.StatusOK {
|
|
return fmt.Errorf("http [%s] %s", resp.Status, data)
|
|
}
|
|
if len(data) > 0 {
|
|
log.Println("[http body]", string(data))
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func Md5(p []byte) string {
|
|
t := md5.Sum(p)
|
|
return hex.EncodeToString(t[:])
|
|
}
|
|
|
|
func Main() {
|
|
ctx := context.Background()
|
|
c, err := NewController(&minioImpl{}, NewKV())
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
|
|
name := "hello.txt"
|
|
data := []byte("hello world")
|
|
|
|
userID := "10000"
|
|
|
|
name = path.Join("user_"+userID, name)
|
|
|
|
addr, err := c.ApplyPut(ctx, &FragmentPutArgs{
|
|
PutArgs: PutArgs{
|
|
Name: name,
|
|
Size: int64(len(data)),
|
|
Hash: Md5(data),
|
|
EffectiveTime: time.Second * 60 * 60,
|
|
},
|
|
FragmentSize: 2,
|
|
})
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
fmt.Println()
|
|
fmt.Println()
|
|
|
|
if addr.ResourceURL != "" {
|
|
log.Println("服务器已经存在")
|
|
return
|
|
}
|
|
var (
|
|
start int
|
|
end = int(addr.FragmentSize)
|
|
)
|
|
|
|
for _, u := range addr.PutURLs {
|
|
if start >= len(data) {
|
|
break
|
|
}
|
|
if end > len(data) {
|
|
end = len(data)
|
|
}
|
|
_ = u
|
|
page := data[start:end]
|
|
fmt.Print(string(page))
|
|
start += int(addr.FragmentSize)
|
|
end += int(addr.FragmentSize)
|
|
err = HttpPut(u, bytes.NewReader(page))
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
}
|
|
fmt.Println()
|
|
fmt.Println()
|
|
|
|
fmt.Println("[PUT_ID]", addr.PutID)
|
|
|
|
info, err := c.ConfirmPut(ctx, addr.PutID)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
|
|
log.Printf("%+v\n", info)
|
|
|
|
log.Println("success")
|
|
}
|