http.go
func WriteMultipartForm(w io.Writer, f *multipart.Form, boundary string) error {
	// Do not care about memory allocations here, since multipart
	// form processing is slow.
	if len(boundary) == 0 {
		panic("BUG: form boundary cannot be empty")
	}

	mw := multipart.NewWriter(w)
	if err := mw.SetBoundary(boundary); err != nil {
		return fmt.Errorf("cannot use form boundary %q: %s", boundary, err)
	}

	// marshal values
	for k, vv := range f.Value {
		for _, v := range vv {
			if err := mw.WriteField(k, v); err != nil {
				return fmt.Errorf("cannot write form field %q value %q: %s", k, v, err)
			}
		}
	}

	// marshal files
	for k, fvv := range f.File {
		for _, fv := range fvv {
			vw, err := mw.CreatePart(fv.Header)
			if err != nil {
				return fmt.Errorf("cannot create form file %q (%q): %s", k, fv.Filename, err)
			}
			fh, err := fv.Open()
			if err != nil {
				return fmt.Errorf("cannot open form file %q (%q): %s", k, fv.Filename, err)
			}
			if _, err = copyZeroAlloc(vw, fh); err != nil {
				return fmt.Errorf("error when copying form file %q (%q): %s", k, fv.Filename, err)
			}
			if err = fh.Close(); err != nil {
				return fmt.Errorf("cannot close form file %q (%q): %s", k, fv.Filename, err)
			}
		}
	}

	if err := mw.Close(); err != nil {
		return fmt.Errorf("error when closing multipart form writer: %s", err)
	}

	return nil
}
func WriteMultipartForm(w io.Writer, f *multipart.Form, boundary string) error {
	// Do not care about memory allocations here, since multipart
	// form processing is slow.
	if len(boundary) == 0 {
		panic("BUG: form boundary cannot be empty")
	}

	mw := multipart.NewWriter(w)
	if err := mw.SetBoundary(boundary); err != nil {
		return fmt.Errorf("cannot use form boundary %q: %s", boundary, err)
	}

	// marshal values
	for k, vv := range f.Value {
		for _, v := range vv {
			if err := mw.WriteField(k, v); err != nil {
				return fmt.Errorf("cannot write form field %q value %q: %s", k, v, err)
			}
		}
	}

	// marshal files
	for k, fvv := range f.File {
		for _, fv := range fvv {
			vw, err := mw.CreatePart(fv.Header)
			if err != nil {
				return fmt.Errorf("cannot create form file %q (%q): %s", k, fv.Filename, err)
			}
			fh, err := fv.Open()
			if err != nil {
				return fmt.Errorf("cannot open form file %q (%q): %s", k, fv.Filename, err)
			}
			if _, err = copyZeroAlloc(vw, fh); err != nil {
				return fmt.Errorf("error when copying form file %q (%q): %s", k, fv.Filename, err)
			}
			if err = fh.Close(); err != nil {
				return fmt.Errorf("cannot close form file %q (%q): %s", k, fv.Filename, err)
			}
		}
	}

	if err := mw.Close(); err != nil {
		return fmt.Errorf("error when closing multipart form writer: %s", err)
	}

	return nil
}
func WriteMultipartForm ( w io . Writer , f * multipart . Form , boundary string ) error { // Do not care about memory allocations here, since multipart // form processing is slow. if len ( boundary ) == 0 { panic ( " " ) } mw := multipart . NewWriter ( w ) if err := mw . SetBoundary ( boundary ) ; err != nil { return fmt . Errorf ( " " , boundary , err ) } // marshal values for k , vv := range f . Value { for _ , v := range vv { if err := mw . WriteField ( k , v ) ; err != nil { return fmt . Errorf ( " " , k , v , err ) } } } // marshal files for k , fvv := range f . File { for _ , fv := range fvv { vw , err := mw . CreatePart ( fv . Header ) if err != nil { return fmt . Errorf ( " " , k , fv . Filename , err ) } fh , err := fv . Open ( ) if err != nil { return fmt . Errorf ( " " , k , fv . Filename , err ) } if _ , err = copyZeroAlloc ( vw , fh ) ; err != nil { return fmt . Errorf ( " " , k , fv . Filename , err ) } if err = fh . Close ( ) ; err != nil { return fmt . Errorf ( " " , k , fv . Filename , err ) } } } if err := mw . Close ( ) ; err != nil { return fmt . Errorf ( " " , err ) } return nil }
// WriteMultipartForm writes the given multipart form f with the given
// boundary to w.
WriteMultipartForm writes the given multipart form f with the given boundary to w .