forked from loafle/openapi-generator-original
[Go] Fix for 'Invalid code for files array in multipart/form-data request'… (#8103)
* Fix for 'Invalid code for files array in multipart/form-data request' (OpenAPITools#8093) * Executed ensure-up-to-date * Replaced spaces with tabs.
This commit is contained in:
parent
f2d8e3a25b
commit
9e5610488f
@ -228,7 +228,7 @@ public class GoServerCodegen extends AbstractGoCodegen {
|
|||||||
for (CodegenOperation operation : operations) {
|
for (CodegenOperation operation : operations) {
|
||||||
for (CodegenParameter param : operation.allParams) {
|
for (CodegenParameter param : operation.allParams) {
|
||||||
// import "os" if the operation uses files
|
// import "os" if the operation uses files
|
||||||
if (!addedOSImport && "*os.File".equals(param.dataType)) {
|
if (!addedOSImport && ("*os.File".equals(param.dataType) || ("[]*os.File".equals(param.dataType)))) {
|
||||||
imports.add(createMapping("import", "os"));
|
imports.add(createMapping("import", "os"));
|
||||||
addedOSImport = true;
|
addedOSImport = true;
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
|
|||||||
}
|
}
|
||||||
{{/isInteger}}{{^isLong}}{{^isInteger}}
|
{{/isInteger}}{{^isLong}}{{^isInteger}}
|
||||||
{{paramName}} := {{#isArray}}strings.Split({{/isArray}}query.Get("{{paramName}}"){{#isArray}}, ","){{/isArray}}{{/isInteger}}{{/isLong}}{{/isQueryParam}}{{#isFormParam}}{{#isFile}}
|
{{paramName}} := {{#isArray}}strings.Split({{/isArray}}query.Get("{{paramName}}"){{#isArray}}, ","){{/isArray}}{{/isInteger}}{{/isLong}}{{/isQueryParam}}{{#isFormParam}}{{#isFile}}
|
||||||
{{paramName}}, err := ReadFormFileToTempFile(r, "{{paramName}}")
|
{{#isArray}}{{paramName}}, err := ReadFormFilesToTempFiles(r, "{{paramName}}"){{/isArray}}{{^isArray}}{{paramName}}, err := ReadFormFileToTempFile(r, "{{paramName}}"){{/isArray}}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(500)
|
w.WriteHeader(500)
|
||||||
return
|
return
|
||||||
|
@ -7,9 +7,9 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
{{#featureCORS}}
|
{{#featureCORS}}
|
||||||
"github.com/gorilla/handlers"
|
"github.com/gorilla/handlers"
|
||||||
{{/featureCORS}}
|
{{/featureCORS}}
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -37,9 +37,9 @@ func NewRouter(routers ...Router) *mux.Router {
|
|||||||
var handler http.Handler
|
var handler http.Handler
|
||||||
handler = route.HandlerFunc
|
handler = route.HandlerFunc
|
||||||
handler = Logger(handler, route.Name)
|
handler = Logger(handler, route.Name)
|
||||||
{{#featureCORS}}
|
{{#featureCORS}}
|
||||||
handler = handlers.CORS()(handler)
|
handler = handlers.CORS()(handler)
|
||||||
{{/featureCORS}}
|
{{/featureCORS}}
|
||||||
|
|
||||||
router.
|
router.
|
||||||
Methods(route.Method).
|
Methods(route.Method).
|
||||||
@ -66,28 +66,61 @@ func EncodeJSONResponse(i interface{}, status *int, w http.ResponseWriter) error
|
|||||||
|
|
||||||
// ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file
|
// ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file
|
||||||
func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) {
|
func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) {
|
||||||
r.ParseForm()
|
_, fileHeader, err := r.FormFile(key)
|
||||||
formFile, _, err := r.FormFile(key)
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return readFileHeaderToTempFile(fileHeader)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadFormFilesToTempFiles reads files array data from a request form and writes it to a temporary files
|
||||||
|
func ReadFormFilesToTempFiles(r *http.Request, key string) ([]*os.File, error) {
|
||||||
|
if err := r.ParseMultipartForm(32 << 20); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
files := make([]*os.File, 0, len(r.MultipartForm.File[key]))
|
||||||
|
|
||||||
|
for _, fileHeader := range r.MultipartForm.File[key] {
|
||||||
|
file, err := readFileHeaderToTempFile(fileHeader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
files = append(files, file)
|
||||||
|
}
|
||||||
|
|
||||||
|
return files, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// readFileHeaderToTempFile reads multipart.FileHeader and writes it to a temporary file
|
||||||
|
func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error) {
|
||||||
|
formFile, err := fileHeader.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
defer formFile.Close()
|
defer formFile.Close()
|
||||||
file, err := ioutil.TempFile("tmp", key)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer file.Close()
|
|
||||||
fileBytes, err := ioutil.ReadAll(formFile)
|
fileBytes, err := ioutil.ReadAll(formFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file, err := ioutil.TempFile("", fileHeader.Filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
file.Write(fileBytes)
|
file.Write(fileBytes)
|
||||||
|
|
||||||
return file, nil
|
return file, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// parseInt64Parameter parses a sting parameter to an int64
|
// parseInt64Parameter parses a sting parameter to an int64
|
||||||
func parseInt64Parameter(param string) (int64, error) {
|
func parseInt64Parameter(param string) (int64, error) {
|
||||||
return strconv.ParseInt(param, 10, 64)
|
return strconv.ParseInt(param, 10, 64)
|
||||||
|
@ -68,28 +68,61 @@ func EncodeJSONResponse(i interface{}, status *int, w http.ResponseWriter) error
|
|||||||
|
|
||||||
// ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file
|
// ReadFormFileToTempFile reads file data from a request form and writes it to a temporary file
|
||||||
func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) {
|
func ReadFormFileToTempFile(r *http.Request, key string) (*os.File, error) {
|
||||||
r.ParseForm()
|
_, fileHeader, err := r.FormFile(key)
|
||||||
formFile, _, err := r.FormFile(key)
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return readFileHeaderToTempFile(fileHeader)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadFormFilesToTempFiles reads files array data from a request form and writes it to a temporary files
|
||||||
|
func ReadFormFilesToTempFiles(r *http.Request, key string) ([]*os.File, error) {
|
||||||
|
if err := r.ParseMultipartForm(32 << 20); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
files := make([]*os.File, 0, len(r.MultipartForm.File[key]))
|
||||||
|
|
||||||
|
for _, fileHeader := range r.MultipartForm.File[key] {
|
||||||
|
file, err := readFileHeaderToTempFile(fileHeader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
files = append(files, file)
|
||||||
|
}
|
||||||
|
|
||||||
|
return files, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// readFileHeaderToTempFile reads multipart.FileHeader and writes it to a temporary file
|
||||||
|
func readFileHeaderToTempFile(fileHeader *multipart.FileHeader) (*os.File, error) {
|
||||||
|
formFile, err := fileHeader.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
defer formFile.Close()
|
defer formFile.Close()
|
||||||
file, err := ioutil.TempFile("tmp", key)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer file.Close()
|
|
||||||
fileBytes, err := ioutil.ReadAll(formFile)
|
fileBytes, err := ioutil.ReadAll(formFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file, err := ioutil.TempFile("", fileHeader.Filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
file.Write(fileBytes)
|
file.Write(fileBytes)
|
||||||
|
|
||||||
return file, nil
|
return file, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// parseInt64Parameter parses a sting parameter to an int64
|
// parseInt64Parameter parses a sting parameter to an int64
|
||||||
func parseInt64Parameter(param string) (int64, error) {
|
func parseInt64Parameter(param string) (int64, error) {
|
||||||
return strconv.ParseInt(param, 10, 64)
|
return strconv.ParseInt(param, 10, 64)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user