英文:
serve file endpoint in golang with gin
问题
我想要为动态加载的用户文件提供服务(假设是简单的文件存储),但在发送实际文件之前,我想要添加一些检查(比如用户是否被禁止)。我知道在gin中有一种方法可以提供整个目录的服务,也有一种方法可以将文件作为附件发送(https://stackoverflow.com/questions/31638447/how-to-server-a-file-from-a-handler-in-golang),但是否有一种方法可以将文件直接作为实际图像发送回浏览器(而不是下载附件提示),就像这个纯Go语言示例中一样(https://golangbyexample.com/image-http-response-golang/):
package main
import (
	"io/ioutil"
	"net/http"
)
func main() {
	handler := http.HandlerFunc(handleRequest)
	http.Handle("/photo", handler)
	http.ListenAndServe(":8080", nil)
}
func handleRequest(w http.ResponseWriter, r *http.Request) {
	fileBytes, err := ioutil.ReadFile("test.png")
	if err != nil {
		panic(err)
	}
	w.WriteHeader(http.StatusOK)
	w.Header().Set("Content-Type", "application/octet-stream")
	w.Write(fileBytes)
	return
}
英文:
I would like to serve dynamically loaded user files (let's assume simple file storage) but I want to add some checks before sending actual file (like was the user banned). I know there is a way to serve whole directory in gin, there is also way to send file as attachment (https://stackoverflow.com/questions/31638447/how-to-server-a-file-from-a-handler-in-golang) but is there a way to simply send back file as actual image to show in browser (without download attachment prompt) as in this pure golang example (https://golangbyexample.com/image-http-response-golang/):
package main
import (
	"io/ioutil"
	"net/http"
)
func main() {
	handler := http.HandlerFunc(handleRequest)
	http.Handle("/photo", handler)
	http.ListenAndServe(":8080", nil)
}
func handleRequest(w http.ResponseWriter, r *http.Request) {
	fileBytes, err := ioutil.ReadFile("test.png")
	if err != nil {
		panic(err)
	}
	w.WriteHeader(http.StatusOK)
	w.Header().Set("Content-Type", "application/octet-stream")
	w.Write(fileBytes)
	return
}
答案1
得分: 2
是的,使用go-gin是可以实现的。你可以使用gin上下文的Data方法。
import (
	"io/ioutil"
	"net/http"
	"github.com/gin-gonic/gin"
)
func main() {
	r := gin.Default()
	r.GET("/photo", photoHandler)
	if err := r.Run(":8080"); err != nil {
		panic(err)
	}
}
func photoHandler(c *gin.Context) {
	// 在这里进行其他检查
	// 读取文件
	fileBytes, err := ioutil.ReadFile("test.png")
	if err != nil {
		panic(err)
	}
	c.Data(http.StatusOK, "image/png", fileBytes)
}
你可以在这里查看gin提供的示例代码链接。
英文:
Yes, it is possible with go-gin. You can use Data method of gin context.
> Data writes some data into the body stream and updates the HTTP code.
import (
	"io/ioutil"
	"net/http"
	"github.com/gin-gonic/gin"
)
func main() {
	r := gin.Default()
	r.GET("/photo", photoHandler)
	if err := r.Run(":8080"); err != nil {
		panic(err)
	}
}
func photoHandler(c *gin.Context) {
	// do the other checks here
	// read the file
	fileBytes, err := ioutil.ReadFile("test.png")
	if err != nil {
		panic(err)
	}
	
	c.Data(http.StatusOK, "image/png", fileBytes)
}
Check gin provided sample code here
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论