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

Doherty代码:

我一直试图找出如何从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)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从一个json文件中获取数据

使用从一个 HTTP 请求到另一个 Azure 的响应数据

如何在Go中从一个文件读取多个JSON对象

如何从一个PHP文件中获取JSON数据的HTML文件打印

如何将值从一个功能文件中的表传递到另一功能文件的JSON请求?

如何将多个JSON数据列表从一个文件读取到Pandas中

Docker/Symfony/Reactjs/Keycloak:如何使用单独的 docker-compose 文件从一个容器向另一个容器发出 HTTP 请求?

如何在一个Ajax请求中添加文件和HTML类型数据

在一个HTTP请求中并从一个控制器(导轨)进行POST和DELETE

如何创建带有接口名称的特定部分的文件,然后再从另一个文件中进行解析以使用GO中的数据修改接口?

使用 R 中的复杂规则从一个变量中解析数据

将响应数据从一个 http 请求传递到下一个

如何通过awk从一个文件中的并排列中的多个文件输出数据?

如何使用Go从JSON文件读取一个值

如何从一个.csv文件php中的3个表中导出数据

如何使用 array.push() 方法,以便将数据从一个组件推送到单独文件中的数组?

如何在解析python中的json数据时解析多个索引值并创建一个csv文件

如何从一个有状态类中的文件加载数据并在 flutter 中的另一个有状态类中使用它?

如何从一个JSON响应中拆分两个对象的数据?

使用 Maven 和 Jetty 将数据从一个 JSP 文件发送到另一个

如何从一个功能文件表中读取数据并在空手道的* .json文件中传递值以设置json参数?

Elm:如何在后续请求中使用来自一个HTTP请求的数据

如何制作和处理一个Http请求,将json文件作为响应在Android中?

从一个文件中读取字典并使用 python 从熊猫创建一个 excel(数据框)l

使用 http 请求将文件从一个 docker 容器发送到另一个容器的 Python3.8.5 问题

使用angular4中的@RequestPart在一个请求中发布多部分文件和json

如何从一个文件中创建多个列表?

Shell脚本问题:如何从一行xml文件中解析一个特殊的“单词”

如何使用Alamofire和SwiftyJSON正确创建一个类来保存JSON中的数据