http - 在 golang 中渲染来自 base64 的图像

标签 http go

我想在 golang 中渲染来自 base64 的图像(这里是 Twitter 图标)

package main

import (
    base64 "encoding/base64"
    "fmt"
    "io"
    "net/http"
    "strconv"
)

func pix(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
    var cookie *http.Cookie
    cookie, err := r.Cookie("csrftoken")
    if err != nil {
        fmt.Printf("error")
        fmt.Println(err)
    }
    fmt.Printf(cookie.Value)
    w.Header().Set("Content-Type", "image/jpeg")
    p, err := base64.StdEncoding.DecodeString("iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAADMUlEQVRYw+2YTUgUYRjHZzOJIoNA+rrUyYNIRQgRHaLo4qFDBEGeunSxS9TFU0QEnhIh6IvokrUzO2uamRmbG6XmR/mVaKZpZVbYvvO143zszsxOz+yahNm+785sITEP72F3Z+adH8/zf5+PpagwtxKXj+Vj+Vg+lo/lY+W+WI4KpddKwWIQFUSF97nNLcLGZt75SiOHchEXfskDVmYjlowpiEoei3UT2ljcFJOpOd169C1Z2SuvgsdpB7cgzB16EV/byGM2xDIVPxQujKmBDF/2m2l0vFvmEin7N2v8kiiPiOeGlGHRvP1RdxA9eYtGR7pk2Pf6lI7RCoP2RaWkZWe3fsFc18hvesAHPGEFUc24ltnx3kyiCJwfRMs6dTXLdSIjO9Osal18qzKfE5V9coDxhlU7qS3uOyiaB55JDtkS2TKoLCLaOLPS4b02pQdCHiUfRKf653/d2kjZN6f10jYxI2EnrGk5H+2WsVi6ZZ8fVSmGQKaYyyFuR6ugmUtVrJo2C7HokeGq8447sYpOPBbo3XFzKC95626sZlz905sUM9XLGbXvtKtTOhZrQDApkhNNkiAOPo/viojh2YSZsj1aF2eQ5n2stuomNQjiiGQanrFufdCXP8gu8tbhjridJ6saVPKExXJrwlwfb3pnAg2Ut0tEBZFI8gza81Tik15DCDIoINQ7aQdBo90RMfrdwNaWLFY9opJGkBQrhCA/HXspQ8W1XHkN6vfWFiGH9ouwhdpJUFuy2JX3eg6uyqENpNHZYcUd02jcLMI2WO67UwZVv1G1HLMq3L83KuEbLPdY7IL2L42p0MMQiuzkq/ncwucOi6qPbWkWoPfCUsENpweUnP1EmE4XGhgagT72RyXolkSCHBbTU3By3fgJj8VyJW3CmSHl8oTWMJuYUUizVvtcsuyJ6J4J663CMLevXar/lJgnKNSgbphzKjriTn5i0F8eX9ODXnEzf6JHvjGtv+aNGdWCOEKnJRmpr5oFVQV8WTWglIKHMlPhv5uqQ1xGYfB5fRMPo+n2VmFbi7ChiS9oWBhZvXrI01TNLg7yPxt51v9rxMfysXwsH8vH+g+wfgDUr+5LcyNV4AAAAABJRU5ErkJggg==")
    if err != nil {
        http.Error(w, "internal error", 500)
        return
    }
    w.Header().Set("Content-Length", strconv.Itoa(len(p))) //len(dec)
    io.WriteString(w, string(p))
}

func main() {
    http.HandleFunc("/pix/", pix)
    err := http.ListenAndServe(":9080", nil)
    if err != nil {
        fmt.Println(err)
    }
}

但是当我尝试访问 URL 时它没有显示任何内容;它下载一个包含错误的文件。有人知道这是为什么吗?

最佳答案

您正在将图像以外的数据写入客户端。具体来说,这一行:

fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])

您的浏览器尝试将内容呈现为 JPEG,但由于这些额外数据而失败,因此它会提示您下载它。去掉它,图片就可以正常显示了。

您还应该遵循@Mellow Marmot 的建议并使用w.Write(p) 而不是io.WriteString(w, string(p))

关于http - 在 golang 中渲染来自 base64 的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41144656/

相关文章:

http - 什么是可见的 ASCII 字符?

http - ActiveMQ 5.2.0 + REST + HTTP POST = java.lang.OutOfMemoryError

go - Golang 扫描文本文件中的单词

docker - 错误层=rpc 写入响应 :write tcp 127. 0.0.1 :40000->127. 0.0.1:41558:使用关闭的网络连接

go - 从网址/字符串中剪切最后一个文件夹,并拆分并加入

go - 在 Go 中读取命令的结果

c# - 如何在 C# 中递归遍历并记录 HttpRequestMessage 的属性?

javascript - 在文件中同时递增计数器

javascript - 使用 XMLHttpRequest 读取文件名包含 % 的文件

去 1.13 : gcc-5 not in PATH