From 488c8cc92ff745d11c5e8c7d1381c331cf4e6651 Mon Sep 17 00:00:00 2001 From: hongruiqi Date: Wed, 12 Sep 2012 17:45:11 +0800 Subject: [PATCH 1/2] 4.3 review --- 4.3.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) 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$ From 51301500b22052f0e57eb8d2acb01f11edab29d5 Mon Sep 17 00:00:00 2001 From: hongruiqi Date: Wed, 12 Sep 2012 17:55:56 +0800 Subject: [PATCH 2/2] 4.5 review --- 4.5.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) 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 @@ 我们通过上面的实例代码打印出来上传文件的信息如下 -![](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$ \ No newline at end of file + * $Id$