前面的话
作者为 golang 脑残粉, 本篇内容可能会引起 phper 不适, 请慎读!
前两天有同事遇到一个问题, 需要一个能支持上传, 下载功能的 HTTP 服务器做一个数据中心. 我刚好弄过, 于是答应帮他搭一个.
HTTP 服务器, 首先想到的就是 PHP + nginx. 于是开撸, 先写一个 PHP 的上传
- <?php
- if ($_FILES["file"]["error"]> 0)
- {
- echo "错误::" . $_FILES["file"]["error"] . "<br>";
- }
- else
- {
- if (file_exists("upload/" . $_FILES["file"]["name"]))
- {
- echo $_FILES["file"]["name"] . "文件已经存在.";
- }
- else
- {
- move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
- echo "文件存储在:" . "upload/" . $_FILES["file"]["name"];
- }
- }
- ?>
好了, 写好了! 需求完成了! 测试一下把!
于是开始第一次测试, 结果: 失败!
原因是 PHP 的 upload_max_filesize 只有 2M, 上传的文件大小超过限制了.
修改了一下 php.ini 配置, 再次测试可以上传了
那么部署到服务器上去把. 服务器上有一个 openresty(nginx 的系列的 web 服务器), 把 upload.php 文件丢里面, 然后重启服务. 好了, 又可以测试一下了!
于是第二次测试, 结果: 失败!
原因是, openresty 默认没开 php 解析, 要改下配置. 把 nginx.conf 里的 php 解析打开一下. 重启 nginx, 然后再测试一下吧~
于是, 第三次测试, 还是失败!
原来.. 这台机器上, 虽然有 nginx, 但是没有安装 PHP!!! 想到还要去外网下载 PHP, 然后还要选版本, 然后回来安装还要配置环境变量以及 openresty 关联 php 的配置后..
算了, 再见吧 PHP!
轮到 Go 语言上场的时候了!!
在 golang 的世界里 1 行代码就能搞定一个文件服务器
- package main
- import (
- "log"
- "net/http"
- )
- func main() {
- log.Fatal(http.ListenAndServe(":8038", http.FileServer(http.Dir("./"))))
- }
就这样, 你就可以在本机访问 8038 端口去下载指定路径的文件了! 不需要依赖 nginx 或者其他任何 web 服务器
包含上传, 下载功能的 FileServer.go 全部代码如下
- package main
- import (
- "fmt"
- "io"
- "log"
- "net/http"
- "os"
- )
- const (
- uploadPath = "./Files/"
- )
- func main() {
- http.HandleFunc("/upload", uploadHandle)
- fs := http.FileServer(http.Dir(uploadPath))
- http.Handle("/Files/", http.StripPrefix("/Files", fs))
- log.Fatal(http.ListenAndServe(":8037", nil))
- }
- func uploadHandle(w http.ResponseWriter, r *http.Request) {
- file, head, err := r.FormFile("file")
- if err != nil {
- fmt.Println(err)
- return
- }
- defer file.Close()
- filePath := uploadPath + head.Filename
- fW, err := os.Create(filePath)
- if err != nil {
- fmt.Println("文件创建失败")
- return
- }
- defer fW.Close()
- _, err = io.Copy(fW, file)
- if err != nil {
- fmt.Println("文件保存失败")
- return
- }
- io.WriteString(w, "save to"+filePath)
- }
如何部署
go 是静态编译型语言, 直接编译出可执行文件, 在 windows 上也就是 exe. 放到任何一台机器上, 不需要安装额外环境, 就能直接运行!
所以编译出 FileServer.exe 文件, 丢到服务器机子上执行.
继续测试! 结果: 成功, 稳!
来源: https://www.cnblogs.com/lijiajia/p/9326940.html