Golang vs PHP 之文件服务器

Golang vs PHP 之文件服务器

前面的话

作者为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文件,丢到服务器机子上执行。

继续测试!结果: 成功,稳!

posted @ 2018-07-18 00:50 李嘉的博客 阅读( ...) 评论( ...) 编辑 收藏
引用\[1\]:Go语言的强项在于它适合用来开发网络并发方面的服务,比如消息推送、监控、容器等,所以在高并发的项目上大多数公司会优先选择 Golang 作为开发语言。另外一个应用就是对一些python,php或者java项目进行重构。\[1\]引用\[2\]:golang,也就是我们熟知的go语言的全称。Go语言是谷歌发布的第二款开源编程语言。专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。\[2\]引用\[3\]:Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。\[3\] 回答: Golang是谷歌发布的第二款开源编程语言,全称为Go语言。它专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。\[2\]Go语言在服务器编程方面有广泛的应用,特别适合处理网络并发方面的服务,比如消息推送、监控、容器等。因此,在高并发的项目中,很多公司会优先选择Go语言作为开发语言。此外,Go语言还可以用于对其他编程语言项目进行重构,如Python、PHP或Java项目。\[1\]在服务器编程方面,Go语言还适用于处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等。在网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等。此外,Go语言还在内存数据库和云平台领域有应用,许多国外的云平台都采用Go语言进行开发。\[3\] #### 引用[.reference_title] - *1* [Golang介绍](https://blog.csdn.net/weixin_44190790/article/details/126077642)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [golang语言适合做什么](https://blog.csdn.net/weixin_56242987/article/details/128020542)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值