golang - golang multipart upload, 파일서버로 post 값 보내기, 멀티, 다중 파일 업로드
이 름 : 바다아이
|
조회수 : 10186
짧은 주소 : https://www.bada-ie.com/su/?551591780764
이렇게 하면 여러 서버에 파일을 전송할 수 있습니다.
일반 업로드 방식은 보통 클라이언트 form 에서 넘어온 파일을 받아서 처리합니다.
그런데 이것은 클라이언트가 아닌
golang 자체로 post 값을 직접 특정 서버로 보내 준다고 보시면 됩니다.
많은 응용이 가능하겠죠...
아래 예제에서는 locallhost 쪽으로 post 값을 보내는 예제입니다.
보내고 자신이 클라이언트가 되어 그 결과를 다시 받아서 출력해 주죠...
제일 밑에 보면 body 출력할 때 그쪽에서 처리한 내용을 출력해 줍니다.
만약 잘 업로드 되서 ok 라는 문자를 그 쪽에서 웹 브라우저로 출력 했다면 그 내용을 그대로 출력하는 것입니다.
extraParams 얘네들도 post 항목이 됩니다.
받는 서버 쪽에서 title := req.FormValue("title") 해서 받아보시면 title 값도 잘 출력됩니다.
package main
import (
"bytes""fmt""io""log""mime/multipart""net/http""os""path/filepath"
)
// Creates a new file upload http request with optional extra paramsfuncnewfileUploadRequest(uri string, params map[string]string, paramName string, path []string)(*http.Request, error) {
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
for i := 0; i < len(path); i++ {
file, err := os.Open(path[i])
if err != nil {
returnnil, err
}
part, err := writer.CreateFormFile(paramName, filepath.Base(path[i]))
if err != nil {
returnnil, err
}
_, err = io.Copy(part, file)
file.Close()
}
for key, val := range params {
_ = writer.WriteField(key, val)
}
err := writer.Close()
if err != nil {
returnnil, err
}
req, err := http.NewRequest("POST", uri, body)
req.Header.Set("Content-Type", writer.FormDataContentType())
return req, err
}
funcmain() {
var fileman []string// 보낼 파일
path, _ := os.Getwd()
fileman = append(fileman, path+"/1522222833_sea.mp4")
fileman = append(fileman, path+"/1522222834.mp4")
// 얘네들도 post 항목이 됩니다.... 단지 파일만 따로 post 변수 이름을 짓는 겁니다. 나머지는 모아서...// title, author 이런게 다 post 변수가 됩니다.
extraParams := map[string]string{
"title": "My Document",
"author": "Matt Aimonetti",
"description": "A document with all the Go programming language secrets",
}
request, err := newfileUploadRequest("http://localhost", extraParams, "파일post변수이름", fileman)
if err != nil {
log.Fatal(err)
}
client := &http.Client{}
resp, err := client.Do(request)
if err != nil {
log.Fatal(err)
} else {
body := &bytes.Buffer{}
_, err := body.ReadFrom(resp.Body)
if err != nil {
log.Fatal(err)
}
resp.Body.Close()
fmt.Println(resp.StatusCode)
fmt.Println(resp.Header)
fmt.Println(body)
}
}
참고 : https://gist.github.com/mattetti/5914158
|
|
번 호
카테고리
제 목
이름
조회수
Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Ubuntu + GoLang + PostgreSQL + Mariadb ]
서버위치 : 오라클 클라우드 춘천 실행시간 : 0.06758 초 to webmaster... gogo sea. gogo sea.