广告
返回顶部
首页 > 资讯 > 后端开发 > GO >解决golang post文件时Content-Type出现的问题
  • 232
分享到

解决golang post文件时Content-Type出现的问题

2024-04-02 19:04:59 232人浏览 八月长安
摘要

同事用PHP写了一个接口,要上传文件,让我做下测试,直接用curl命令调用成功,然后想用golang写个示例, 源码如下: package main import (

同事用PHP写了一个接口,要上传文件,让我做下测试,直接用curl命令调用成功,然后想用golang写个示例,

源码如下:


package main 
import (
    "bytes" 
    "fmt" 
    "io/ioutil" 
    "mime/multipart" 
    "net/Http" 
)
 
func main() { 
    uri := "http://xxxxxxxxxxxx/api/fileattr" //URL地址 xxxxxxxxxxxx由商务提供 
    name := "xxxxxxxxxxxx" //用户名 
    pass := "xxxxxxxxxxxx" //密码 
    fn := "xxxxxxxxxxxx.txt" //文件路径
 
    //读出文本文件数据 
    file_data, _ := ioutil.ReadFile(fn) 
    body := new(bytes.Buffer) 
    w := multipart.NewWriter(body)
 
    //取出内容类型 
    content_type := w.FORMDataContentType() 
    //将文件数据写入 
    pa, _ := w.CreateFormFile("file", fn) 
    pa.Write(file_data) 
    //设置用户名密码 
    w.WriteField("name", name) 
    w.WriteField("pass", pass) 
    w.Close() 
    //开始提交
 
    req, _ := http.NewRequest("POST", uri, body) 
    req.Header.Set("Content-Type", content_type) 
    resp, _ := http.DefaultClient.Do(req) 
    data, _ := ioutil.ReadAll(resp.Body) 
    resp.Body.Close() 
    fmt.Println(resp.StatusCode) 
    fmt.Printf("%s", data) 
}

发现总是调用失败,返回文件类型不对,询问后得知,同事做了判断,文件只能为text/plain类型,抓包发现,我提交时的文件类型为:application/octet-stream,仔细查看Golang源码:mime/multipart/write.go,CreateFormFile的源码是这样的:


func (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error) { 
    h := make(textproto.MIMEHeader) 
    h.Set("Content-Disposition", 
        fmt.Sprintf(`form-data; name="%s"; filename="%s"`, 
            escapeQuotes(fieldname), escapeQuotes(filename))) 
    h.Set("Content-Type", "application/octet-stream") 
    return w.CreatePart(h) 
}

可以得知Content-Type被固定为了application/octet-stream,知道原因了,问题就好解决了。

第一种方法

就是直接修改CreateFormFile,或者加个CreateFormFile2命令,这种方法将来golang升级后可能会出问题。

第二种方法

可以自己来CreatePart:


h := make(textproto.MIMEHeader)
    h.Set("Content-Disposition",
        fmt.Sprintf(`form-data; name="%s"; filename="%s"`,
            escapeQuotes(fieldname), escapeQuotes(filename)))
    h.Set("Content-Type", "text/plain")

再用 w.CreatePart(h)得到io.Writer,问题解决!这种方法不侵入golang源代码,最终代码如下:


package main 
import (
    "bytes"
    "fmt"
    "io/ioutil"
    "mime/multipart"
    "net/http"
    "net/textproto"
)
 
func main() {
    uri := "http://xxxxxxxxxxxx/api/fileattr" //URL地址 xxxxxxxxxxxx由商务提供
    name := "xxxxxxxxxx"                      //用户名
    pass := "xxxxxxx"                         //密码
    fn := "x:/xxx/xxx.txt"                    //文件路径
 
    //读出文本文件数据
    file_data, _ := ioutil.ReadFile(fn)
 
    body := new(bytes.Buffer)
    w := multipart.NewWriter(body)
 
    //取出内容类型
    content_type := w.FormDataContentType()
 
    //将文件数据写入
    h := make(textproto.MIMEHeader)
    h.Set("Content-Disposition",
        fmt.Sprintf(`form-data; name="%s"; filename="%s"`,
            "file", //参数名为file
            fn))
    h.Set("Content-Type", "text/plain") //设置文件格式
    pa, _ := w.CreatePart(h)
    pa.Write(file_data)
 
    //设置用户名密码
    w.WriteField("name", name)
    w.WriteField("pass", pass)
 
    w.Close() 
    //开始提交
    req, _ := http.NewRequest("POST", uri, body)
    req.Header.Set("Content-Type", content_type)
    resp, _ := http.DefaultClient.Do(req)
    data, _ := ioutil.ReadAll(resp.Body)
    resp.Body.Close()
    fmt.Println(resp.StatusCode)
    fmt.Printf("%s", data)
}

补充:用go来玩最简单的web服务器------顺便说说Content-Type字段

WEB服务端代码s.go:


package main 
import (
    "io"
    "log"
    "net/http"
)
 
func handlerHello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello girls")
}
 
func main() {
    http.HandleFunc("/hello", handlerHello)     // 注册   
    err := http.ListenAndServe("localhost:8080", nil)
    if err != nil {
        log.Println(err)
    }
}

go run s.go一下,跑起来, 然后在浏览器执行http://127.0.0.1:8080/hello (或者在命令行用curl发http请求也可以), 浏览器上的结果为:


hello girls

好简单。可以在客户端或者服务端抓包看下, 很典型的http req和rsp.

我们再来看一个有趣的问题, 修改s.go为:


package main 
import (
    "io"
    "log"
    "net/http"
)
 
func handlerHello(w http.ResponseWriter, r *http.Request) {
    str := `
        table border="1">
        <tr>
        <td>row 1, cell 1</td>
        <td>row 1, cell 2</td>
        </tr>
        <tr>
        <td>row 2, cell 1</td>
        <td>row 2, cell 2</td>
        </tr>
        </table>
        ` 
    io.WriteString(w, str)
}
 
func main() {
    http.HandleFunc("/hello", handlerHello)     // 注册   
    err := http.ListenAndServe("localhost:8080", nil)
    if err != nil {
        log.Println(err)
    }
}

再次重启服务并发请求, 浏览器上显示的内容是:


table border="1">
 <tr>
	 <td>row 1, cell 1</td>
	 <td>row 1, cell 2</td>
 </tr>
 <tr>
	 <td>row 2, cell 1</td>
	 <td>row 2, cell 2</td>
 </tr>
</table>

抓包看一下, 发现有:Content-Type: text/plain; charset=utf-8

因此, 浏览器需要根据纯文本显示。 注意到, 上述的table左边少了一个"<". 我们加上后,

s.go的代码如下:


package main 
import (
    "io"
    "log"
    "net/http"
)
 
func handlerHello(w http.ResponseWriter, r *http.Request) {
    str := `
        <table border="1">
        <tr>
        <td>row 1, cell 1</td>
        <td>row 1, cell 2</td>
        </tr>
        <tr>
        <td>row 2, cell 1</td>
        <td>row 2, cell 2</td>
        </tr>
        </table>
        ` 
    io.WriteString(w, str)
}
 
func main() {
    http.HandleFunc("/hello", handlerHello)     // 注册   
    err := http.ListenAndServe("localhost:8080", nil)
    if err != nil {
        log.Println(err)
    }
}

再次重启服务,发请求,浏览器端的显示是:

row 1, cell 1 row 1, cell 2
row 2, cell 1 row 2, cell 2

抓包看, 有Content-Type: text/html; charset=utf-8

可见, 服务端会判断str的格式,来确定Content-Type的类型, 从而决定了浏览器端的展示方式。服务端的自动判断行为, 有点意思。 在我看来, 这样不太好,应该让程序员来指定Content-Type.

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文档:

--结束END--

本文标题: 解决golang post文件时Content-Type出现的问题

本文链接: https://www.lsjlt.com/news/125067.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决golang post文件时Content-Type出现的问题
    同事用php写了一个接口,要上传文件,让我做下测试,直接用curl命令调用成功,然后想用golang写个示例, 源码如下: package main import ( ...
    99+
    2022-11-12
  • MySQL运行SQL文件时出现问题的解决方法
    这篇文章主要介绍了MySQL运行SQL文件时出现问题的解决方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。参考:Mysql错误:check...
    99+
    2022-10-18
  • 完美解决go Fscanf 在读取文件时出现的问题
    先要明白Fscanf的工作原理 Fscanf在遇到\n才结束 遇到\r时就会把\r替换成0 这就有个问题,要注意自己的文本换行符是什么,在Windows下就是\r\n,在Lin...
    99+
    2022-06-07
    fscanf GO
  • 如何解决go Fscanf在读取文件时出现的问题
    这篇文章将为大家详细讲解有关如何解决go Fscanf在读取文件时出现的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先要明白Fscanf的工作原理Fscanf在遇到\n才结束遇到\r时就会把\r替换...
    99+
    2023-06-14
  • 如何解决AJAX在Post中文的时候乱码问题
    这篇文章主要讲解了“如何解决AJAX在Post中文的时候乱码问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决AJAX在Post中文的时候乱码问题”...
    99+
    2022-10-19
  • 如何解决Java文件重定向时出现的常见问题?
    Java 文件重定向是一个非常常见的操作,在 Java 中有很多种方式来进行文件重定向。然而,在进行文件重定向时,我们常常会遇到一些问题,例如文件路径不正确、文件无法打开或者文件读写出错等。那么,该如何解决这些常见的问题呢?本文将会为您详细...
    99+
    2023-09-05
    文件 重定向 load
  • 解决Mybatis的serverTimezone时区出现问题
    目录Mybatis serverTimezone时区出现问题错误信息出现原因解决Mybatis 插件碰到的时区问题及用法Mybatis serverTimezone时区出现问题 错误...
    99+
    2022-11-12
  • 解决Navicat for Oracle(MySQL)导入csv文件时出现中文乱码的问题
    文章目录 前言1、导入csv文件时出现中文乱码2、解决方法3、重新导入文件 总结 前言 1、导入csv文件时出现中文乱码 这是因为csv文件的编码格式与导入数据库的编码格式不符合而...
    99+
    2023-09-03
    oracle 数据库
  • pd.read_csv读取文件路径出现的问题解决
    目录写在前面出现的问题解决问题用相对路径读取数据集完整的代码参考写在前面 在用pd.read_csv读取数据集时,我有2个疑问?1是:写相对路径还是绝对路径。2是:相对路径,绝对路径...
    99+
    2022-11-11
  • JupyterNotebook读取csv文件出现的问题及解决
    目录Jupyter Notebook读取csv文件失败Excel跨表使用注意事项(包含jupyter读取csv)(1)问题(2)问题(3)问题总结Jupyter Notebook读取...
    99+
    2023-01-04
    Jupyter Notebook读取csv文件 Jupyter Notebook csv Jupyter Notebook读取csv问题
  • Python解决读取文件出现空行的问题
    使用python读取文本时,发现输出时,会有空行,经百度找到解决方案 文本1内容如下:1 2 3 4 5 6 67python内容如下:#!/usr/bin/env python # _*_coding:utf-8_*_ file = op...
    99+
    2023-01-31
    空行 文件 Python
  • Python转json时出现中文乱码的问题及解决
    目录Python转json时出现中文乱码设置报文头连接数据库设置编码将数据转换为json设置json编码python json转json字符串时,中文被转义核心总结Python转js...
    99+
    2023-02-08
    Python转json json中文乱码 Python json中文乱码
  • 如何解决使用vue-aplayer插件时出现的问题
    这篇文章主要介绍如何解决使用vue-aplayer插件时出现的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:安装$ npm install ...
    99+
    2022-10-19
  • 探讨如何解决Golang的文件乱码问题
    最近学习 Golang 的过程中,遇到了一个非常让人头疼的问题——文件乱码。在这篇文章中,我们将探讨如何解决 Golang 中的文件乱码问题。一、文件编码在讨论如何解决 Golang 中的文件乱码问题之前,我们需要了解有关文件编码的一些基础...
    99+
    2023-05-14
  • 如何解决InternetExplorer9安装时出现的问题
    要解决Internet Explorer 9安装时出现的问题,可以尝试以下方法:1. 检查系统要求:确保你的计算机符合Interne...
    99+
    2023-09-07
    Internet
  • Jupyter Notebook读取csv文件出现问题如何解决
    这篇文章主要介绍“Jupyter Notebook读取csv文件出现问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Jupyter Notebook读取csv文件出现问...
    99+
    2023-07-04
  • 怎么解决springboot读取自定义配置文件时出现乱码问题
    这篇文章主要介绍“怎么解决springboot读取自定义配置文件时出现乱码问题”,在日常操作中,相信很多人在怎么解决springboot读取自定义配置文件时出现乱码问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-25
  • 解决安装软件包时出现E:无法定位的问题
    第一种情况:在确定网络连接和质量没问题的情况下,任何软件都无法安装,出现E:无法定位XXX 解决:换源 具体步骤: 备份 /etc/apt/sources.list 文件 执行命令 sudo cp /etc/apt/sources.list...
    99+
    2023-10-05
    ubuntu linux 服务器
  • 数据库update时出现的问题怎么解决
    这篇文章主要介绍了数据库update时出现的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇数据库update时出现的问题怎么解决文章都会有所收获,下面我们一起来看看...
    99+
    2022-10-19
  • PIP安装python包出现超时问题的解决
    我们在使用pip默认源进行模块安装时,经常会超时问题导致不能下载。如图所示:   下面是解决方法—换源。 在自己电脑的C:\Users\25103\AppData...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作