Ajax 上传文件到 GoLang 服务器,内容类型为 Multipart

我正在尝试使用多部分表单将音频文件上传到 Golang 服务器。但是,Go 返回错误:


multipart: NextPart: bufio: buffer full

我相信这表明我的 Javascript 请求中没有多部分格式的内容。这是我的Javascript:


function UploadFile(file) {

    var xhr = new XMLHttpRequest();



    if (file.type == "audio/mpeg" && file.size <= $id("MAX_FILE_SIZE").value) {

        // start upload

        var boundary = '---------------------------' + Math.floor(Math.random()*32768) + Math.floor(Math.random()*32768) + Math.floor(Math.random()*32768);


        xhr.open("POST", $id("upload").action, true);

        xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary);

        xhr.setRequestHeader("X_FILENAME", file.name);

        xhr.send(file);

    }

}

这是我的 Golang 服务器处理程序:


func FileHandler(w http.ResponseWriter, r *http.Request) {

    var (

        status int

        err    error

    )

    defer func() {

        if nil != err {

            http.Error(w, err.Error(), status)

        }

    }()

    // parse request with maximum memory of _24Kilobits

    const _24K = (1 << 20) * 24

    if err = r.ParseMultipartForm(_24K); nil != err {

        fmt.Println(err)

        status = http.StatusInternalServerError

        return

    }

    for _, fheaders := range r.MultipartForm.File {

        for _, hdr := range fheaders {

            // open uploaded

            var infile multipart.File

            if infile, err = hdr.Open(); nil != err {

                status = http.StatusInternalServerError

                return

            }

            // open destination

            var outfile *os.File

            if outfile, err = os.Create("./uploaded/" + hdr.Filename); nil != err {

                status = http.StatusInternalServerError

                return

            }

            // 32K buffer copy

            var written int64

            if written, err = io.Copy(outfile, infile); nil != err {

                status = http.StatusInternalServerError

                return

            }

        }

    }

}

如果有人对我收到此错误的原因有任何想法,我将不胜感激。


慕容708150
浏览 422回答 2
2回答

一只甜甜圈

在与 Ajax 请求进行了漫长而艰苦的斗争之后,我让它发送了正确的信息。这是我使用的代码:var xhr = new XMLHttpRequest(),&nbsp; &nbsp; boundary=Math.random().toString().substr(2);var formdata = new FormData();formdata.append("file", file);xhr.open("POST", $id("upload").action, true);//xhr.setRequestHeader("content-type", "multipart/form-data; charset=utf-8; boundary=" + boundary);xhr.send(formdata);请注意标题不再使用,我发现您可以比任何其他方法更容易地将数据附加到 formdata

HUX布斯

不确定这个答案是否适合您,但我能够form-data在客户端使用 ajax 上传文件,并在服务器上使用以下 Go 代码小片段:file, handler, err := r.FormFile("img") // img is the key of the form-dataif err != nil {&nbsp; &nbsp; fmt.Println(err)&nbsp; &nbsp; return}defer file.Close()fmt.Println("File is good")fmt.Println(handler.Filename)fmt.Println()fmt.Println(handler.Header)f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {&nbsp; &nbsp; fmt.Println(err)&nbsp; &nbsp; return}defer f.Close()io.Copy(f, file)这r是*http.Request。PS 这只是将文件存储在同一文件夹中,不执行任何安全检查。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go