gofiber / fiber

⚡️ Express inspired web framework written in Go
https://gofiber.io
MIT License
33.1k stars 1.63k forks source link

🤗 [Question]: Does fiber v3's Request not have the function of adding files to FormData? #3007

Open wnnce opened 3 months ago

wnnce commented 3 months ago

Question Description

I have an interface that needs to use FormData to upload files, but the AddFormDate() provided can only add strings, while AddFile() adds the file to the files field and not to the FormDate. image

Code Snippet (optional)

var fiberClient *client.Client

func init() {
    fiberClient = client.New()
}

func uploadFile(fileName string, reader io.ReadCloser) {
    uploadToken := makeUploadToken(fileName, 1*time.Hour)
    formFile := client.AcquireFile(func(f *client.File) {
        f.SetName("file")
        f.SetFieldName(fileName)
        f.SetReader(reader)
    })
    request := client.AcquireRequest()
    request.AddFormData("key", fileName)
    request.AddFormData("token", uploadToken)
    request.AddFiles(formFile)
    response, err := request.Post(REGION)
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Println(string(response.Body()))
}

Checklist:

welcome[bot] commented 3 months ago

Thanks for opening your first issue here! 🎉 Be sure to follow the issue template! If you need help or want to chat with us, join us on Discord https://gofiber.io/discord

ReneWerner87 commented 3 months ago

@efectn can you help here

wnnce commented 3 months ago

@efectn can you help here

I implemented the requirement using fasthttp's multipart.NewWriter() and RawRequest

func upload(fileName string, reader io.ReadCloser) {
    uploadToken := makeUploadToken(fileName, 1*time.Hour)
    request := client.AcquireRequest()

    requestBody := &bytes.Buffer{}
    multipartWriter := multipart.NewWriter(requestBody)
    fileWriter, err := multipartWriter.CreateFormFile("file", fileName)
    if err != nil {
        log.Fatalln(err)
    }
    if _, err = io.Copy(fileWriter, reader); err != nil {
        log.Fatalln(err)
    }
    if err = multipartWriter.WriteField("key", fileName); err != nil {
        log.Fatalln(err)
    }
    if err = multipartWriter.WriteField("token", uploadToken); err != nil {
        log.Fatalln(err)
    }
    if err = multipartWriter.Close(); err != nil {
        log.Fatalln(err)
    }
    request.SetRawBody(requestBody.Bytes())
    request.AddHeader("Content-Type", multipartWriter.FormDataContentType())
    response, err := request.Post(REGION)
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Println(string(response.Body()))
}
carlos19960601 commented 1 month ago

same request here