|
41 | 41 | r.ParseMultipartForm(32 << 20)
|
42 | 42 | file, handler, err := r.FormFile("file")
|
43 | 43 | if err != nil {
|
44 |
| - fmt.Println(err) |
| 44 | + fmt.Println(err) |
45 | 45 | return
|
46 | 46 | }
|
47 | 47 | defer file.Close()
|
48 | 48 | fmt.Fprintf(w, "%v", handler.Header)
|
49 | 49 | f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
|
50 | 50 | if err != nil {
|
51 |
| - panic(err) |
| 51 | + fmt.Println(err) |
| 52 | + return |
52 | 53 | }
|
53 | 54 | defer f.Close()
|
54 | 55 | io.Copy(f, file)
|
55 | 56 | }
|
56 | 57 | }
|
57 | 58 |
|
58 |
| -通过上面的代码可以看到,处理文件上传我们需要调用`r.ParseMultipartForm`,里面的参数表示`maxMemory`,调用`ParseMultipartForm`之后,上传的文件存储在`maxMemory`大小的内存里面,如果文件大小超过了`maxMemory`,那么剩下的部分将存储在系统的临时文件中。我们可以通过`r.FormFile`获取上面的文件句柄,然后实例中使用了`io.Copy`来存储文件。 |
| 59 | +通过上面的代码可以看到,处理文件上传我们需要调用`r.ParseMultipartForm`,里面的参数表示`maxMemory`,调用`ParseMultipartForm`之后,上传的文件存储在`maxMemory`大小的内存里面,如果文件大小超过了`maxMemory`,那么剩下的部分将存储在系统的临时文件中。我们可以通过`r.FormFile`获取上面的文件句柄,然后实例中使用了`io.Copy`来存储文件。 |
59 | 60 |
|
60 |
| ->获取其他非文件字段信息的时候就不需要调用`r.ParseForm`,因为在需要的时候Go自动会去调用。而且`ParseMultipartForm`调用一次之后,后面再次调用不会再有效果。 |
| 61 | +>获取其他非文件字段信息的时候就不需要调用`r.ParseForm`,因为在需要的时候Go自动会去调用。而且`ParseMultipartForm`调用一次之后,后面再次调用不会再有效果。 |
61 | 62 |
|
62 | 63 | 通过上面的实例我们可以看到我们上传文件主要三步处理:
|
63 | 64 |
|
|
75 | 76 |
|
76 | 77 | 我们通过上面的实例代码打印出来上传文件的信息如下
|
77 | 78 |
|
78 |
| - |
79 |
| - |
| 79 | + |
| 80 | + |
80 | 81 |
|
81 | 82 | ##客户端上传文件
|
82 | 83 |
|
|
95 | 96 | )
|
96 | 97 |
|
97 | 98 | func postFile(filename string, targetUrl string) error {
|
98 |
| - bodyBuf := bytes.NewBufferString("") |
| 99 | + bodyBuf := &bytes.Buffer{} |
99 | 100 | bodyWriter := multipart.NewWriter(bodyBuf)
|
100 | 101 |
|
101 | 102 | //关键的一步操作
|
|
113 | 114 | }
|
114 | 115 |
|
115 | 116 | //iocopy
|
116 |
| - io.Copy(fileWriter, fh) |
| 117 | + _, err = io.Copy(fileWriter, fh) |
| 118 | + if err != nil { |
| 119 | + return err |
| 120 | + } |
117 | 121 |
|
118 | 122 | contentType := bodyWriter.FormDataContentType()
|
119 | 123 | bodyWriter.Close()
|
120 | 124 |
|
121 | 125 | resp, err := http.Post(targetUrl, contentType, bodyBuf)
|
122 | 126 | if err != nil {
|
123 |
| - panic(err.Error()) |
| 127 | + return err |
124 | 128 | }
|
125 | 129 | defer resp.Body.Close()
|
126 | 130 | resp_body, err := ioutil.ReadAll(resp.Body)
|
127 | 131 | if err != nil {
|
128 |
| - panic(err.Error()) |
| 132 | + return err |
129 | 133 | }
|
130 | 134 | fmt.Println(resp.Status)
|
131 | 135 | fmt.Println(string(resp_body))
|
|
150 | 154 | * 下一节: [小结](<4.6.md>)
|
151 | 155 |
|
152 | 156 | ## LastModified
|
153 |
| - * $Id$ |
| 157 | + * $Id$ |
0 commit comments