|
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