Merge pull request #19 from hongruiqi/review

Review 4.3 && 4.5
This commit is contained in:
astaxie
2012-09-12 05:27:27 -07:00
2 changed files with 30 additions and 13 deletions

17
4.3.md
View File

@@ -33,6 +33,19 @@
输出
Hello, <script>alert('you have been pwned')</script>!
或者使用template.HTML类型
import "html/template"
...
t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
err = t.ExecuteTemplate(out, "T", template.HTML("<script>alert('you have been pwned')</script>"))
输出
Hello, <script>alert('you have been pwned')</script>!
转换成template.HTML后变量的内容也不会被转义
转义的例子:
@@ -45,7 +58,7 @@
Hello, &lt;script&gt;alert(&#39;you have been pwned&#39;)&lt;/script&gt;!
## links
* [目录](<preface.md>)
@@ -53,4 +66,4 @@
* 下一节: [防止多次递交表单](<4.4.md>)
## LastModified
* $Id$
* $Id$

26
4.5.md
View File

@@ -41,23 +41,24 @@
r.ParseMultipartForm(32 << 20)
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
fmt.Println(err)
return
}
defer file.Close()
fmt.Fprintf(w, "%v", handler.Header)
f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
panic(err)
fmt.Println(err)
return
}
defer f.Close()
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 @@
我们通过上面的实例代码打印出来上传文件的信息如下
![](images/4.5.upload2.png?raw=true)
![](images/4.5.upload2.png?raw=true)
##客户端上传文件
@@ -95,7 +96,7 @@
)
func postFile(filename string, targetUrl string) error {
bodyBuf := bytes.NewBufferString("")
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
//关键的一步操作
@@ -113,19 +114,22 @@
}
//iocopy
io.Copy(fileWriter, fh)
_, err = io.Copy(fileWriter, fh)
if err != nil {
return err
}
contentType := bodyWriter.FormDataContentType()
bodyWriter.Close()
resp, err := http.Post(targetUrl, contentType, bodyBuf)
if err != nil {
panic(err.Error())
return err
}
defer resp.Body.Close()
resp_body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err.Error())
return err
}
fmt.Println(resp.Status)
fmt.Println(string(resp_body))
@@ -150,4 +154,4 @@
* 下一节: [小结](<4.6.md>)
## LastModified
* $Id$
* $Id$