golang中如何获取文件的扩展名?

golang中如何获取文件的扩展名?

在go的path包里,有func Ext(path string) string方法,这个方法可以获取文件的扩展名,他的返回值是带点.的,比如文件名称是test.txt, 使用这个函数后,返回值是.txt。如果文件没有扩展名,这个方法返回空字符。详情查看源码。

// Ext returns the file name extension used by path.
// The extension is the suffix beginning at the final dot
// in the final slash-separated element of path;
// it is empty if there is no dot.
func Ext(path string) string {
	for i := len(path) - 1; i >= 0 && path[i] != '/'; i-- {
		if path[i] == '.' {
			return path[i:]
		}
	}
	return ""
}

从源码中可以看出,是从字符串的最后一个字符开始遍历,遇到点.结束。如果没有扩展名,则遇到/就结束。最差的情况是把整个字符串都遍历一边。

### Golang 实现获取与处理上传文件 #### 使用标准库实现单个文件上传 当构建Web服务时,有时需要提供上传文件的功能。下面展示了一个利用Go语言的标准库`net/http`来创建一个简单的HTTP服务器,并允许客户端上传文件的例子[^1]。 ```go package main import ( "fmt" "io" "net/http" "os" ) func uploadHandler(w http.ResponseWriter, r *http.Request) { file, handler, err := r.FormFile("file") if err != nil { fmt.Println("Error Retrieving the File") fmt.Println(err) return } defer file.Close() f, err := os.OpenFile("./uploads/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { fmt.Println(err) return } defer f.Close() io.Copy(f, file) fmt.Fprintf(w, "Successfully Uploaded!") } func setupRoutes() { http.HandleFunc("/upload", uploadHandler) http.ListenAndServe(":8080", nil) } func main() { setupRoutes() } ``` 此代码片段定义了一个为`uploadHandler`的处理器函数用于接收POST请求中的文件数据;并通过调用`FormFile()`方法获得上传文件的对象及其元信息。之后打开一个新的本地文件准备写入接收到的数据,最后使用`io.Copy()`完成实际的数据复制操作[^3]。 #### 利用 Gin 框架简化开发过程 对于更复杂的项目来说,采用像Gin这样的第三方框架能够极大地提高效率。这里给出一段基于Gin框架实现相同功能——即接受来自用户的文件提交并将之保存至服务器端指定位置上的示例程序: ```go package main import ( "github.com/gin-gonic/gin" "log" "net/http" "path/filepath" ) func UploadSingleFile(c *gin.Context) { form, _ := c.MultipartForm() files := form.File["files"] for _, file := range files { log.Printf("Received file: %v\n", file.Filename) ext := filepath.Ext(file.Filename) log.Printf("File extension is :%s \n", ext) err := c.SaveUploadedFile(file, "./uploads/" + file.Filename) if err != nil { c.String(http.StatusBadRequest, fmt.Sprintf("error:%s", err.Error())) return } } c.JSON(http.StatusOK, gin.H{"message": "Files uploaded successfully"}) } func main() { r := gin.Default() r.POST("/upload", UploadSingleFile) r.Run(":9090") // listen and serve on 0.0.0.0:9090 } ``` 上述例子展示了如何借助于Gin内置的方法轻松地解析多部分表单(`MultipartForm`)并从中提取出所有被标记为`files[]`字段内的文件项。此外还运用了`filepath.Ext()`函数来取得每个文件对应的扩展名[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值