当前位置: 首页 > 面试题库 >

如何使用Go从一个HTTP请求中解析文件和JSON数据?

盛浩阔
2023-03-14
问题内容

我一直试图找出如何从Angularjs前端的一个HTTP请求表单中解析PDF文档和JSON数据。请求有效负载为

HTTP请求

内容处置:表单数据;name =“文件”; filename =“ Parent Handbook.pdf”内容类型:application / pdf

内容处置:表单数据;name =“ doc”

{“ title”:“ test”,“ cat”:“ test cat”,“ date”:20142323}

“文件”是pdf,“ doc”是我要解析的json数据。

我的处理程序可以很好地解析和保存文件,但无法从Json中获取任何内容。有任何想法吗?

func (s *Server) PostFileHandler(w http.ResponseWriter, r *http.Request) {
    const _24K = (1 << 20) * 24
    err := r.ParseMultipartForm(_24K)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    doc := Doc{}
    jsonDecoder := json.NewDecoder(r.Body)
    fmt.Println(r.Body)
    err = jsonDecoder.Decode(&doc)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Println(doc.Title, doc.Url, doc.Cat, doc.Date)
    doc.Id = len(docs) + 1
    err = s.db.Insert(&doc)
    checkErr(err, "Insert failed")

    // files := m.File["myFile"]
    for _, fheaders := range r.MultipartForm.File {
        for _, hdr := range fheaders {
            var infile multipart.File
            infile, err = hdr.Open()
            // defer infile.Close()
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
            doc.Url = hdr.Filename
            fmt.Println(hdr.Filename)
            var outfile *os.File
            outfile, err = os.Create("./docs/" + hdr.Filename)
            // defer outfile.Close()
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
            _, err = io.Copy(outfile, infile)
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }

        }
    }
    s.Ren.JSON(w, http.StatusOK, &doc)
    // http.Error(w, "hit file server", http.StatusOK)
}

问题答案:

在您的示例中,您尝试读取r.Body,就好像它被剥离了请求的PDF部分一样,但事实并非如此。您需要分别处理PDF和JSON这两个部分。为此使用http。(*
Request).MultipartReader()

r.MultipartReader()将返回mime /
multipart.Reader
对象,因此您可以使用r.NextPart()函数遍历各个部分并分别处理每个部分。

因此,您的处理程序函数应如下所示:

func (s *Server) PostFileHandler(w http.ResponseWriter, r *http.Request) {
    mr, err := r.MultipartReader()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    doc := Doc{}
    for {
        part, err := mr.NextPart()

        // This is OK, no more parts
        if err == io.EOF {
            break
        }

        // Some error
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

        // PDF 'file' part
        if part.FormName() == "file" {
            doc.Url = part.FileName()
            fmt.Println("URL:", part.FileName())
            outfile, err := os.Create("./docs/" + part.FileName())
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
            defer outfile.Close()

            _, err = io.Copy(outfile, part)
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
        }

        // JSON 'doc' part
        if part.FormName() == "doc" {
            jsonDecoder := json.NewDecoder(part)
            err = jsonDecoder.Decode(&doc)
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
            fmt.Println(doc.Title, doc.Url, doc.Cat, doc.Date)
        }
    }

    doc.Id = len(docs) + 1
    err = s.db.Insert(&doc)
    checkErr(err, "Insert failed")

    s.Ren.JSON(w, http.StatusOK, &doc)
}


 类似资料:
  • 问题内容: 我想通过Google Directions API动态查询Google Maps。例如,此请求计算通过伊利诺伊州芝加哥市到密苏里州乔普林市和俄克拉荷马州俄克拉荷马市的两个航路点的路线: http://maps.googleapis.com/maps/api/directions/json?origin = Chicago,IL&destination = Los + Angeles,C

  • 问题内容: 在实现代理服务器时,我将HTTP请求作为字符串发送,如下所示: GET http:// localhost:54321 / x HTTP / 1.1 主机:localhost:54321 缓存控制:无缓存 是否有内置的类来解析此请求? 问题答案: 我对这种解析的内置支持一无所知。如果您确实需要这样的解析器,则可以签出以下库: http //hc.apache.org/index.htm

  • 问题内容: 给定以下文件,该文件包含HTTP请求和HTTP响应的HTTP流水线流。 如何将该文件解析为变量? 原始文件: 我知道有http.ReadRequest。那回应呢?任何想法/反馈/想法表示赞赏。 问题答案: 实际上非常简单: 一些注意事项: 有和 并可以在相同的位置上反复调用,直到它“正常工作” “正常工作”取决于Content-Length标头的存在和正确性,因此读取正文会将Reade

  • 本文向大家介绍Python Http请求json解析库用法解析,包括了Python Http请求json解析库用法解析的使用技巧和注意事项,需要的朋友参考一下 httpparser介绍 :1.解析字节类型的http与https请求数据 :2.支持已k-v形式修改请求数据 :3.支持重新编码请求数据 源码 如何使用 1.解析请求数据 request_first,request_headers,req

  • 我的代码基于SpringBoot,接收post请求,解析json数据并使用jdbc执行。 } curl命令如下所示: 但是,当我通过curl发送post请求时,无法解析参数并且始终为空。 为什么会发生这个问题,如何解决? 堆栈跟踪:

  • 我有来自文件的JSON。 并希望解析解决方案和num的列表。 已用库org.json.simple.* 试试这个 我做错了什么? 如果尝试写入 如果尝试写入