dongxi3859
2017-06-03 18:09
浏览 205
已采纳

Golang替代python / flask send_from_directory()

I have this image urls:

/book/cover/Computer_Science.png

but the location of the image actually exists under

/uploads/img/Computer_Science.png

I'm using Gin framework. Is there any command like Flask's send_from_directory() in Gin or in in-built Golang functions?

If not could you share a snippet of how to do it?

Thanks!

图片转代码服务由CSDN问答提供 功能建议

我有此图片网址:

  / book / cover  /Computer_Science.png
  
 
 

,但是图像的位置实际存在于

  / uploads / img / Computer_Science下 .png 
   
 
 

我正在使用 Gin框架。 在Gin或内置的Golang函数中是否有诸如Flask的 send_from_directory()之类的命令?

如果不能,您可以分享一个代码片段吗?

谢谢!

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • doubi7739 2017-06-03 23:33
    已采纳

    Use gin's Context.File to serve file content. This method internally calls http.ServeFile builtin function. The code snippets will be:

    import "path/filepath"
    
    
    // ...
    router := gin.Default()
    // ... 
    
    router.GET("/book/cover/:filename", func(c *gin.Context) {
        rootDir := "/uploads/img/"
        name := c.Param("filename")
        filePath, err :=  filepath.Abs(rootDir + name)
        if err != nil {
            c.AbortWithStatus(404)
        }
    
        //Only allow access to file/directory under rootDir
        //The following code is for ilustration since HasPrefix is deprecated.
        //Replace with correct one when https://github.com/golang/dep/issues/296 fixed
        if !filepath.HasPrefix(filePath, rootDir) {
            c.AbortWithStatus(404)
        }
    
        c.File(filePath)
    })
    

    Update

    As pointed by zerkms, the path name must be sanitized before passing it Context.File. Simple sanitizer is added in the snippet. Please adapt to your needs.

    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题