为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容708150 2021-08-10 20:37:22
我正在尝试使用多部分表单将音频文件上传到 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            }        }    }}如果有人对我收到此错误的原因有任何想法,我将不胜感激。
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

在与 Ajax 请求进行了漫长而艰苦的斗争之后,我让它发送了正确的信息。这是我使用的代码:


var xhr = new XMLHttpRequest(),

    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


查看完整回答
反对 回复 2021-08-10
?
HUX布斯

TA贡献1876条经验 获得超6个赞

不确定这个答案是否适合您,但我能够form-data在客户端使用 ajax 上传文件,并在服务器上使用以下 Go 代码小片段:


file, handler, err := r.FormFile("img") // img is the key of the form-data

if err != nil {

    fmt.Println(err)

    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 {

    fmt.Println(err)

    return

}

defer f.Close()

io.Copy(f, file)

这r是*http.Request。PS 这只是将文件存储在同一文件夹中,不执行任何安全检查。


查看完整回答
反对 回复 2021-08-10
  • 2 回答
  • 0 关注
  • 421 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信