4.5 review
This commit is contained in:
26
4.5.md
26
4.5.md
@@ -41,23 +41,24 @@
|
|||||||
r.ParseMultipartForm(32 << 20)
|
r.ParseMultipartForm(32 << 20)
|
||||||
file, handler, err := r.FormFile("file")
|
file, handler, err := r.FormFile("file")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
fmt.Fprintf(w, "%v", handler.Header)
|
fmt.Fprintf(w, "%v", handler.Header)
|
||||||
f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
|
f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
fmt.Println(err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
io.Copy(f, file)
|
io.Copy(f, file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
通过上面的代码可以看到,处理文件上传我们需要调用`r.ParseMultipartForm`,里面的参数表示`maxMemory`,调用`ParseMultipartForm`之后,上传的文件存储在`maxMemory`大小的内存里面,如果文件大小超过了`maxMemory`,那么剩下的部分将存储在系统的临时文件中。我们可以通过`r.FormFile`获取上面的文件句柄,然后实例中使用了`io.Copy`来存储文件。
|
通过上面的代码可以看到,处理文件上传我们需要调用`r.ParseMultipartForm`,里面的参数表示`maxMemory`,调用`ParseMultipartForm`之后,上传的文件存储在`maxMemory`大小的内存里面,如果文件大小超过了`maxMemory`,那么剩下的部分将存储在系统的临时文件中。我们可以通过`r.FormFile`获取上面的文件句柄,然后实例中使用了`io.Copy`来存储文件。
|
||||||
|
|
||||||
>获取其他非文件字段信息的时候就不需要调用`r.ParseForm`,因为在需要的时候Go自动会去调用。而且`ParseMultipartForm`调用一次之后,后面再次调用不会再有效果。
|
>获取其他非文件字段信息的时候就不需要调用`r.ParseForm`,因为在需要的时候Go自动会去调用。而且`ParseMultipartForm`调用一次之后,后面再次调用不会再有效果。
|
||||||
|
|
||||||
通过上面的实例我们可以看到我们上传文件主要三步处理:
|
通过上面的实例我们可以看到我们上传文件主要三步处理:
|
||||||
|
|
||||||
@@ -75,8 +76,8 @@
|
|||||||
|
|
||||||
我们通过上面的实例代码打印出来上传文件的信息如下
|
我们通过上面的实例代码打印出来上传文件的信息如下
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
##客户端上传文件
|
##客户端上传文件
|
||||||
|
|
||||||
@@ -95,7 +96,7 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
func postFile(filename string, targetUrl string) error {
|
func postFile(filename string, targetUrl string) error {
|
||||||
bodyBuf := bytes.NewBufferString("")
|
bodyBuf := &bytes.Buffer{}
|
||||||
bodyWriter := multipart.NewWriter(bodyBuf)
|
bodyWriter := multipart.NewWriter(bodyBuf)
|
||||||
|
|
||||||
//关键的一步操作
|
//关键的一步操作
|
||||||
@@ -113,19 +114,22 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
//iocopy
|
//iocopy
|
||||||
io.Copy(fileWriter, fh)
|
_, err = io.Copy(fileWriter, fh)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
contentType := bodyWriter.FormDataContentType()
|
contentType := bodyWriter.FormDataContentType()
|
||||||
bodyWriter.Close()
|
bodyWriter.Close()
|
||||||
|
|
||||||
resp, err := http.Post(targetUrl, contentType, bodyBuf)
|
resp, err := http.Post(targetUrl, contentType, bodyBuf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err.Error())
|
return err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
resp_body, err := ioutil.ReadAll(resp.Body)
|
resp_body, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err.Error())
|
return err
|
||||||
}
|
}
|
||||||
fmt.Println(resp.Status)
|
fmt.Println(resp.Status)
|
||||||
fmt.Println(string(resp_body))
|
fmt.Println(string(resp_body))
|
||||||
@@ -150,4 +154,4 @@
|
|||||||
* 下一节: [小结](<4.6.md>)
|
* 下一节: [小结](<4.6.md>)
|
||||||
|
|
||||||
## LastModified
|
## LastModified
|
||||||
* $Id$
|
* $Id$
|
||||||
|
|||||||
Reference in New Issue
Block a user