[Golang] Ir biblioteca estándar http.FileServer lograr los archivos estáticos

http.FileServer métodos pertenecen a la red estándar de la biblioteca / http, devuelve una interfaz para utilizar la raíz de sistema de archivos para proporcionar servicios de acceso de archivos HTTP Handler. Usted puede lograr fácilmente el servidor de archivos estáticos.

http.ListenAndServe(":8080", http.FileServer(http.Dir("/files/path")))

Acceso http://127.0.0.1:8080, se puede ver algo así como Nginx en la exploración de directorios autoindex.

fuente resolución

Ahora estamos por encima de que sólo una línea de código a analizar para ver cómo al final se consigue. código fuente Inglés también se detalla más comentarios, puede hacer referencia a.

Nos fijamos en http.Dir (), vistazo a http.FileServer (), y http.ListenAndServe () escucha en el puerto TCP y proporciona servicios de enrutamiento, no repetiremos aquí.

http.Dir ()

Podemos ver en la fuente, escriba dir instrumentos de cuerda una función de interfaz de tipo abierto interfaz de sistema de archivos, http.Dir ( "/") es http.Dir tipo de retorno real para convertir la cadena en una ruta del sistema de archivos.
El uso de los instrumentos del sistema de archivos del Dir A // La nativa de ficheros de sistema restringido a un
// específica árbol de directorios.
//
// El método FileSystem.Open Considera Mientras '/' - Separado Caminos, el Dir apos String
// valor ESTÁ EN UNA El nombre de archivo nativo archivos de sistema, no la URL de a, por lo que se separa
// por filepath.Separator, que no es necesariamente '/'.
//
// Nota que el permitir que Dir por Will acceso a los archivos y directorios que comienzan con a
// periodo, lo que podría directorios como .git A EXPONER sensibles Directory o
// archivos htpasswd sensible similares. Contenidos del al excluir un punto inicial,
// eliminar los archivos / directorios desde el servidor o crear un sistema de archivos personalizados
// aplicación.
//
// Un vacío Dir es tratado como “”.

type Dir string

// implementa un sistema de archivos para acceder a una colección de archivos con el nombre.
// Los elementos en una ruta de archivo están separados por barra ( '/', U + 002F)
// caracteres, independientemente de la convención del sistema operativo anfitrión.

type FileSystem interface {
	Open(name string) (File, error)
}

// implementa sistema de archivos abiertos utilizando os.Open, creación de ficheros para la lectura arraigada
// y la relación con el directorio d.

func (d Dir) Open(name string) (File, error) {
	if filepath.Separator != '/' && strings.ContainsRune(name, filepath.Separator) {
		return nil, errors.New("http: invalid character in file path")
	}
	dir := string(d)
	if dir == "" {
		dir = "."
	}
	fullName := filepath.Join(dir, filepath.FromSlash(path.Clean("/"+name)))
	f, err := os.Open(fullName)
	if err != nil {
		return nil, mapDirOpenError(err, fullName)
	}
	return f, nil
}
http.FileServer ()

http.FileServer () devuelve ejemplo FileHandler, e implementa un método estructura FileHandler interfaz ServeHTTP Handler (). El núcleo en el método ServeHTTP es el método serveFile ().

// servidorArchivos devuelve un controlador que sirve peticiones HTTP
// con el contenido del sistema de archivos raíz en raíz.
//
// Para utilizar la implementación del sistema de archivos del sistema operativo,
// utilizar http.Dir:
//
// http.Handle ( "/", http.FileServer (http.Dir ( "/ tmp")))
//
/ / Como caso especial, el servidor de archivo devuelto redirige cualquier solicitud
// termina en “index.html” en la misma ruta, sin la final
// “index.html”.

func FileServer(root FileSystem) Handler {
	return &fileHandler{root}
}

FileHandler definición:

type fileHandler struct {
	root FileSystem
}

FileHandler logra ServeHTTP (w ResponseWriter, r * Request) Método:

func (f *fileHandler) ServeHTTP(w ResponseWriter, r *Request) {
	upath := r.URL.Path
	if !strings.HasPrefix(upath, "/") {
		upath = "/" + upath
		r.URL.Path = upath
	}
	serveFile(w, r, f.root, path.Clean(upath), true)
}
serveFile ()

Método serveFile () para determinar, si la ruta de acceso es un directorio, para listar el contenido, si el archivo es usado serveContent (Método contenido del archivo de salida). serveContent () es un método para leer el contenido del archivo y el método de salida en el que el código ya no está unido.

// nombre es '/' - separados, no filepath.Separator.

func serveFile(w ResponseWriter, r *Request, fs FileSystem, name string, redirect bool) {

	// 中间代码已省略

	if d.IsDir() {
		if checkIfModifiedSince(r, d.ModTime()) == condFalse {
			writeNotModified(w)
			return
		}
		w.Header().Set("Last-Modified", d.ModTime().UTC().Format(TimeFormat))
		dirList(w, r, f)
		return
	}

	// serveContent will check modification time
	sizeFunc := func() (int64, error) { return d.Size(), nil }
	serveContent(w, r, d.Name(), d.ModTime(), sizeFunc, f)
}
referencia

https://golang.org/src/net/http/fs.go

Publicados 349 artículos originales · elogios ganado 14 · Vistas a 90000 +

Supongo que te gusta

Origin blog.csdn.net/LU_ZHAO/article/details/105304982
Recomendado
Clasificación