Golang从文件服务器获取图片显示到客户端

Golang从文件服务器获取图片显示到客户端,第1张

概述一、需求        A(客户端)---------------》B(服务端)--------------》C(文件服务器)        在客户端需要显示图片列表,但是不想C(文件服务器)的地址被暴露出来,所以现在是A(客户端)发送URL到B(服务器),B(服务器)去请求C(文件服务器)的图片返回数据,B(服务器)返回图片到A(客户端)显示        注:B和C部署在不同的服务器 二、方法

一、需求

       A(客户端)---------------》B(服务端)--------------》C(文件服务器)

       在客户端需要显示图片列表,但是不想C(文件服务器)的地址被暴露出来,所以现在是A(客户端)发送URL到B(服务器),B(服务器)去请求C(文件服务器)的图片返回数据,B(服务器)返回图片到A(客户端)显示

       注:B和C部署在不同的服务器

二、方法

     1.如果C(文件服务器)是和B(服务端)部署在同一服务器,可以通过os.Open(filename string)(file *file,err error)直接将图片输出;

     2.如果C(文件服务器)不是和B(服务端)部署在同一服务器,可以通过获取图片的数据经过base64后转化将数据输出到客户端;

     3.如果C(文件服务器)不是和B(服务端)部署在同一服务器,通过B(服务端)获取C(文件服务器)的图片数据,直接将图片返回给客户端下面实现

三、实现方法3

     1.如何将图片可以直接输出到客户端,可根据os.Open(filename string)(file *file,err error)方法来实现返回http.file接口类型即可;

     2.查看golang标准库可知道http.file类型接口的实现(net/http)

     

type file interface {    io.Closer    io.Reader    Readdir(count int) ([]os.fileInfo,error)    Seek(offset int64,whence int) (int64,error)    Stat() (os.fileInfo,error)}

   3.通过看http.file接口的方法返回值还需要去实现os.fileInfo类型的接口(查看文档os)

type fileInfo interface {    name() string       // 文件的名字(不含扩展名)    Size() int64        // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同    Mode() fileMode     // 文件的模式位    ModTime() time.Time // 文件的修改时间    IsDir() bool        // 等价于Mode().IsDir()    Sys() interface{}   // 底层数据来源(可以返回nil)}

  4.只要实现了http.file和os.fileInfo两个接口就可以返回能够输出到客户端的类型,实现以下方法

func Close() (err error) func Read(p []byte) (n int,err error) func Readdir(count int) ([]os.fileInfo,error) func Seek(offset int64,error) func Stat() (os.fileInfo,error)func name() string func Size() int64 func Mode() os.fileMode func ModTime() time.Time func IsDir() bool func Sys() interface{} 

四、代码实现

package mainimport (    "bytes"    "fmt"    "io/IoUtil"    "net/http"    "os"    "path/filepath"    "time")//实现file和fileInfo接口的类type Readimg struct {    buf      *bytes.Reader    fileUrl  string    fileData []byte}//获取C的图片数据func ReadimgData(url string) []byte {    resp,err := http.Get(url)    if err != nil {        panic(err)    }    defer resp.Body.Close()    pix,err := IoUtil.ReadAll(resp.Body)    if err != nil {        panic(err)    }    return pix}//实现file和fileInfo接口func (r *Readimg) Close() (err error) {    return nil}func (r *Readimg) Read(p []byte) (n int,err error) {    return r.buf.Read(p)}func (r *Readimg) Readdir(count int) ([]os.fileInfo,error) {    var i os.fileInfo = &Readimg{buf: bytes.NewReader(r.fileData),fileUrl: r.fileUrl,fileData: r.fileData}    return []os.fileInfo{i},nil}func (r *Readimg) Seek(offset int64,error) {    return r.buf.Seek(offset,whence)}func (r *Readimg) Stat() (os.fileInfo,fileData: r.fileData}    return i,nil}func (r *Readimg) name() string {    return filepath.Base(r.fileUrl)[:len(filepath.Base(r.fileUrl))-4]}func (r *Readimg) Size() int64 {    return (int64)(len(r.fileData))}func (r *Readimg) Mode() os.fileMode {    return os.ModeSetuID}func (r *Readimg) ModTime() time.Time {    return time.Now()}func (r *Readimg) IsDir() bool {    return false}func (r *Readimg) Sys() interface{} {    return nil}//处理请求type httpDealimg struct{}func (self httpDealimg) Open(name string) (http.file,error) {    img_name := name[1:]    fmt.Println(img_name)    img_url := "http://localhost:8001/images/Test" + name   //C(文件服务器地址)    img_data := ReadimgData(img_url)  //向服务器气球图片数据    if len(img_data) == 0 {        fmt.Println("file access forbIDden:",name)        return nil,os.ErrNotExist    }    fmt.Println("get img file:",img_url)    var f http.file = &Readimg{buf: bytes.NewReader(img_data),fileUrl: img_name,fileData: img_data}  //标红的可以查看标准库bytes的Reader类型,NewReader(p []byte)可返回*Reader,然后调用和http.file相同的Seek()和Read()方法    return f,nil}func InithttpimgfileServ() {    http.Handle("/img/",http.StripPrefix("/img/",http.fileServer(httpDealimg{})))}func main() {    InithttpimgfileServ()    http.ListenAndServe(":8000",nil)}

六、测试截图

请求地址http://localhost:8000/img/qq.png

后台打印的信息是获取的是http://localhost:8001/images/Test/qq.png,也就是C(文件服务器里图片的真实地址)

 七、结束

  当文件保存在其他的服务器上,需要在客户端显示图片,但是不想被知道真实的路径的时候就可以通过http.file和os.fileInfo去封装一下就可以实现,可能上面介绍的不清楚,有问题的可以留言一起沟通学习一下,谢谢!

  如果有更好的实现方法,希望大家可以分享出来一起学习,谢谢

总结

以上是内存溢出为你收集整理的Golang从文件服务器获取图片显示到客户端全部内容,希望文章能够帮你解决Golang从文件服务器获取图片显示到客户端所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1269712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存