Post multi-part form data for audio file

Viewed 370

I'm wrote a function that posts multipart form data to an endpoint but doesn't seem to be working properly. Here's the code

func Upload(filePath string) error {
    client := &http.Client{
        Timeout: time.Second * 10,
    }
    // New multipart writer.
    body := &bytes.Buffer{}
    file, err := os.Open(filePath)
    if err != nil {
        return err
    }
    writer := multipart.NewWriter(body)
    fw, err := writer.CreateFormFile("file", filepath.Base(filePath))
    if err != nil {
        return err
    }
    _, err = io.Copy(fw, bufio.NewReader(file))
    if err != nil {
        return err
    }
    // Close multipart writer.
    writer.Close()
    req, err := http.NewRequest("POST", "http://localhost:5050/upload", bytes.NewReader(body.Bytes()))
    if err != nil {
        return err
    }
    req.Header.Set("Content-Type", writer.FormDataContentType())
    rsp, _ := client.Do(req)
    if rsp == nil {
        return fmt.Errorf("failed to upload")
    }
    if rsp.StatusCode != http.StatusOK {
        fmt.Printf("Request failed with response code: %d", rsp.StatusCode)
    }
    fmt.Println("rsp: ", rsp.StatusCode)
    return nil
}

The handler on the API receiving the POST is this:

func (m *MetadataService) uploadHandler(res http.ResponseWriter, req *http.Request) {

    file, handler, err := req.FormFile("file")
    if err != nil {
        panic(err) //dont do this
    }
    defer file.Close()
    fmt.Println("req: ", req)
    // Create a buffer to store the header of the file in
    fileHeader := make([]byte, 512)

    // Copy the headers into the FileHeader buffer
    if _, err := file.Read(fileHeader); err != nil {
        panic(err) //dont do this
    }

    // set position back to start.
    if _, err := file.Seek(0, 0); err != nil {
        panic(err) //dont do this
    }

    // copy example
    f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        panic(err) //please dont
    }
    defer f.Close()

    buf := bytes.NewBuffer(nil)
    if _, err := io.Copy(buf, file); err != nil {
        panic(err)
    }
    fmt.Println("filename:", handler.Filename)
    fmt.Println("file.(Sizer).Size():", file.(Sizer).Size())
    fmt.Println("contentType:", http.DetectContentType(fileHeader))

    io.WriteString(res, id)
}

The code panics when reading the fileHeader thought. The content type when sent is "application/octet-stream" when I'd expect it to be "audio/mpeg" since i'm uploading a song. Not sure what's wrong with the aforementioned Upload function. Need help! Thank you!

0 Answers
Related