【问题标题】:Ajax Upload File to GoLang Server with Content Type MultipartAjax 将文件上传到 GoLang 服务器,内容类型为 Multipart
【发布时间】:2014-10-19 01:31:48
【问题描述】:

我正在尝试使用多部分表单将音频文件上传到 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
            }
        w.Write([]byte("uploaded file:" + hdr.Filename + ";length:" + strconv.Itoa(int(written))))
        }
    }
}

如果有人知道我为什么会收到此错误,我将不胜感激。

【问题讨论】:

    标签: javascript html ajax go multipart


    【解决方案1】:

    在与 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 比任何其他方法都容易得多,例如:How to send multipart/form-data form content by ajax (no jquery)?

    【讨论】:

      【解决方案2】:

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

      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。附言这只是将文件存储在同一文件夹中,不执行任何安全检查。

      【讨论】:

        猜你喜欢
        • 2019-12-06
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 2014-02-20
        • 2022-11-24
        • 2016-09-07
        • 1970-01-01
        • 2013-06-15
        相关资源
        最近更新 更多