golang文件服务器的两种方式(可以访问任何目录)

一、方法1:

主要用到的方法是http包的FileServer,参数很简单,就是要路由的文件夹的路径。

package main

import (
  "fmt"
  "net/http"
)

func main() {
  http.Handle("/", http.FileServer(http.Dir("./")))

  e := http.ListenAndServe(":8080", nil)
  fmt.Println(e)
}

上面例子的路由只能把根目录也就是“/”目录映射出来,例如你写成”http.Handle("/files", http.FileServer(http.Dir("./")))“,就无法把通过访问”/files“把当前路径下的文件映射出来。于是就有了http包的StripPrefix方法。

二、方法2:

实现访问任意文件夹下面的文件。

package main

import (
  "fmt"
  "net/http"
)

func main() {
  mux := http.NewServeMux()
  mux.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir("/"))))
  mux.Handle("/c/", http.StripPrefix("/c/", http.FileServer(http.Dir("c:"))))
  mux.Handle("/d/", http.StripPrefix("/d/", http.FileServer(http.Dir("d:"))))
  mux.Handle("/e/", http.StripPrefix("/e/", http.FileServer(http.Dir("e:"))))
  if err := http.ListenAndServe(":3008", mux); err != nil {
    log.Fatal(err)
  }
}

这里生成了一个ServeMux,与文件服务器无关,可以先不用关注。用这种方式,就可以把任意文件夹下的文件路由出来了。

ps:golang实现的文件服务器

最近在学习golang,使用golang实现了一个最简单的文件服务器,程序只有简单的十多行代码,可以编译成windows, linux, mac多平台可执行文件。

源码

package main

import (
 "fmt"
 "net/http"
 "os"
 "path/filepath"
)

func main() {
 p, _ := filepath.Abs(filepath.Dir(os.Args[0]))
 http.Handle("/", http.FileServer(http.Dir(p)))
 err := http.ListenAndServe(":8088", nil)
 if err != nil {
 fmt.Println(err)
 }
}

源码解释

os.Args[0]获取的是执行程序时的第一个参数,默认第一个参数是程序所在的目录
filepath.Abs(filepath.Dir(os.Args[0]))是获取当前可执行程序所在的绝对路径
http.Handle("/", http.FileServer(http.Dir(p)))是开启一个文件服务器,使用当前可执行文件所在的路径
http.ListenAndServe(":8088", nil)是监听8088端口并开启文件服务器

编译

要将源码编译成不同平台的可执行文件,需要使用gox工具,使用下面的命令安装gox:

go get github.com/mitchellh/gox

执行成功之后,使用gox命令即可自动编译出各个平台的可执行文件,如果想为某个平台单独编译,可以使用如下方式:

gox -os "windows linux" -arch amd64

-os参数指定了编译平台,-arch参数指定了处理器架构

运行

直接打开编译出来的可执行程序,即可运行,在浏览器中访问http://ip:8088即可看到可执行文件所在的目录下的所有文件。

到此这篇关于golang文件服务器可以访问任何目录的文章就介绍到这了,更多相关golang文件服务器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解如何热重启golang服务器

    服务端代码经常需要升级,对于线上系统的升级常用的做法是,通过前端的负载均衡(如nginx)来保证升级时至少有一个服务可用,依次(灰度)升级. 而另一种更方便的方法是在应用上做热重启,直接升级应用而不停服务. 原理 热重启的原理非常简单,但是涉及到一些系统调用以及父子进程之间文件句柄的传递等等细节比较多. 处理过程分为以下几个步骤: 监听信号(USR2) 收到信号时fork子进程(使用相同的启动命令),将服务监听的socket文件描述符传递给子进程 子进程监听父进程的socket,这个时候父进程和

  • 浅谈Golang中创建一个简单的服务器的方法

    我们知道,golang中的net/http包对网络的支持非常好,这样会让我们比较容易的建立起一个相对简单的服务器,我们来看一段代码 func sayHi(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w,"Hi") } func main() { http.HandleFunc("/sayHi", sayHi) log.Fatal(http.ListenAndServe("localhost:80

  • golang搭建静态web服务器的实现方法

    我胡汉三又回来啦.好久没发文了,为保持平台上的活跃度,我今天就分享下个刚学到的知识,使用golang搭建静态web服务器,亲测可用,附代码! 使用过golang语言的程序猿都应该知道,在使用golang开发的时候,我们是不需要诸如iis,apache,nginx,kangle等服务器支持的. 为什么呢? 原因是,golang的net/http包中已经提供了HTTP的客户端与服务端实现方案. 网上言论都说golang不适合做web开发,相对php.java..net.nodejs等各类后端语言来说

  • golang实现http服务器处理静态文件示例

    本文实例讲述了golang实现http服务器处理静态文件的方法.分享给大家供大家参考,具体如下: 新版本更精简: 复制代码 代码如下: package main import (     "flag"     "log"     "net/http"     "os"     "io"     "path"     "strconv" ) var dir string

  • golang文件服务器的两种方式(可以访问任何目录)

    一.方法1: 主要用到的方法是http包的FileServer,参数很简单,就是要路由的文件夹的路径. package main import ( "fmt" "net/http" ) func main() { http.Handle("/", http.FileServer(http.Dir("./"))) e := http.ListenAndServe(":8080", nil) fmt.Print

  • golang 随机数的两种方式

    golang支持两种随机数生成方式: math/rand          // 伪随机 crypto/rand        // 真随机 math/rand伪随机生成的数字是确定的,不论在什么机器.什么时间,只要执行的随机代码一样,那么生成的随机数就一样.为了尽量随机性,那么我们可以每次使用不同的seed来启动程序,就可以保证每次启动都产生新的随机数,聪明的你肯定想到了使用时间戳 func main() { fmt.Println(rand.Intn(100)) //设置随机数种子,由于种子

  • Nginx配置同一个域名同时支持http与https两种方式访问实现

    Nginx配置同一个域名http与https两种方式都可访问,证书是阿里云上免费申请的 server { listen 80; listen 443 ssl; ssl on; server_name 域名; index index.html index.htm index.php default.html default.htm default.php; ssl_certificate /usr/local/nginx/cert/21402058063066221.pem; //下载申请后阿里s

  • 详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)

    最近做项目遇到生成二维码的问题,发现网上用的最多的是ThoughtWorks.QRCode和QrCode.Net两种方式.访问官网看着例子写了两个Demo,使用过程中发现两个都挺好用的,ThoughtWorks.QRCode的功能更多一些,但是dll文件有6兆,QrCode.Net只有400多K,大家根据自己的需要选择吧.附上代码仅供参考. 并且提供VS2013写的一个Demo提供给大家免费下载.如有疑问欢迎交流. ThoughtWorks.QRCode: private void Create

  • javascript面向对象之访问对象属性的两种方式分析

    本文实例分析了javascript面向对象之访问对象属性的两种方式.分享给大家供大家参考.具体如下: javascript面向对象的访问对象属性的两种方式.如下代码所示: 复制代码 代码如下: <script language="javascript" type="text/javascript"> function Person(){}; var p1 = new Person(); p1.name="王美人"; document.

  • JS访问对象两种方式区别解析

    可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名"方法名" var obj = { name : "小明", age : 18, say : function(){ console.log("我是"+this.name+"我"+this.age+"岁"); } }; console.log(obj.name); conso

  • golang中接口对象的转型两种方式

    接口对象的转型有两种方式: 1. 方式一:instance,ok:=接口对象.(实际类型) 如果该接口对象是对应的实际类型,那么instance就是转型之后对象,ok的值为true 配合if...else if...使用 2. 方式二: 接口对象.(type) 配合switch...case语句使用 示例: package main import ( "fmt" "math" ) type shape interface { perimeter() int area

  • 深入SqlServer2008 数据库同步的两种方式(Sql JOB)的分析介绍

    下面介绍的就是数据库同步的两种方式: 1.SQL JOB的方式  sql Job的方式同步数据库就是通过SQL语句,将一个数据源中的数据同步到目标数据库中.特点是它可以灵活的通过SQL的方式进行数据库之间的同步操作.可以在制定的时间时间作为任务计划自动执行.缺点是需要写SQL来进行操作.既然是数据库之间的同步就涉及到数据库之间的连接.建立连接是同步的第一步.SQL Server建立连接可以通过系统存储过程建立[是否还有其他方式,我还不清楚].存储过程有以下几个:sp_droplinkedsrvl

  • 分享java中设置代理的两种方式

    1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式.直接上代码. 2 采用设置系统属性 import java.net.Authenticator; import java.net.PasswordAuthentication; import java.util.Properties; public class ProxyDemo1 { public

  • Oracle创建Database Link的两种方式详解

    创建一个dblink,命名为dblink_name,从A数据库连到B数据库,B数据库的IP为192.168.1.73,端口为1521,实例名为oracle,登录名为tast,密码为test. 一菜单方式: 打开plsql,点击[File]-[New]-[Database link],打开如下图所示窗口 填好各项信息后,点击[Apply]即可完成Database Link的创建. 二SQL方式 -- Drop existing database link drop public database

随机推荐