diff --git a/4.3.md b/4.3.md
index 783e889f..52689d00 100644
--- a/4.3.md
+++ b/4.3.md
@@ -33,6 +33,19 @@
输出
Hello, !
+
+或者使用template.HTML类型
+
+ import "html/template"
+ ...
+ t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
+ err = t.ExecuteTemplate(out, "T", template.HTML(""))
+
+输出
+
+ Hello, !
+
+转换成template.HTML后,变量的内容也不会被转义
转义的例子:
@@ -45,7 +58,7 @@
Hello, <script>alert('you have been pwned')</script>!
-
+
## links
* [目录]()
@@ -53,4 +66,4 @@
* 下一节: [防止多次递交表单](<4.4.md>)
## LastModified
- * $Id$
\ No newline at end of file
+ * $Id$
diff --git a/4.5.md b/4.5.md
index b63450b9..2b308ed1 100644
--- a/4.5.md
+++ b/4.5.md
@@ -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 @@
我们通过上面的实例代码打印出来上传文件的信息如下
-
-
+
+
##客户端上传文件
@@ -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$
\ No newline at end of file
+ * $Id$