如何在golang中编写一个带有文件的目录?

4

现在,我正在尝试使用os.Create函数,但是在指定文件路径时出现错误。我需要将HTML中的文件上传到特定目录的文件系统中。

file,err:= c.FormFile("file")
if err!=nil{
    checkErr(err)
}
src, err := file.Open()
if err!=nil{
    checkErr(err)
}
defer src.Close()

abs,err :=filepath.Abs("/dir1/dir2/")
if err!=nil{
    checkErr(err)
}

dst,err := os.Create(abs+"/"+file.Filename)
if err !=nil{
    checkErr(err)
}
defer dst.Close()
if _,err = io.Copy(dst,src); err!=nil{
    checkErr(err)
}

我必须将文件上传到dir2目录。请帮我一下,谢谢。


请提供代码。 - Rudziankoŭ
请查看代码@Rudziankoŭ - Krish Bhanushali
如果 abs/dir1/dir2/,那么在使用 os.Create 创建文件时需要连接额外的 / - Rudziankoŭ
2
这可能不是问题,但请用filepath.Join(abs, file.Filename)替换abs+"/"+file.Filename。另外,使用客户端提供的文件名可能存在安全隐患。 - Charlie Tumahai
程序有什么错误提示吗? - leaf bebop
是的!我从来不知道在Go中不能这样连接字符串。你必须使用strings.Join()。 我只需使用os.Create(strings.Join([]string{path,file.FileName},"/"))就解决了这个问题,其中我的路径只是我的目录路径的字符串。 - Krish Bhanushali
2个回答

11

使用filepath.Join来创建从目录dir和文件名生成的路径。

为了防止在文件系统中写入任意位置,请使用filepath.Base来清理路径。

file, err := c.FormFile("file")
if err != nil {
    checkErr(err)
    return
}
src, err := file.Open()
if err != nil {
    checkErr(err)
    return
}
defer src.Close()

dst, err := os.Create(filepath.Join(dir, filepath.Base(file.Filename))) // dir is directory where you want to save file.
if err != nil {
    checkErr(err)
    return
}
defer dst.Close()
if _, err = io.Copy(dst, src); err != nil {
    checkErr(err)
    return
}

1
“checkErr(err)”这个函数不是很明显,我在范围内没有这样的函数,并且快速搜索也找不到答案。它只是一个“某些用户定义的函数”,用于检查错误吗? - chill appreciator
1
@standalone 函数checkErr来自问题。这是一个应用程序提供的处理错误的函数。除了在问题和答案中所做的方式之外,还有其他处理错误的方法,但这超出了所要求的范围。 - Charlie Tumahai

0

这就是我在不使用 io.Copy(...) 的情况下完成它的方式。

package main

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

func main() {
    cwd, _ := os.Getwd()
    err := os.Mkdir("new-dir", os.ModePerm) // you might want different file access, this suffice for this example
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("Created %s at %s\n", "new-dir", cwd)
    }

    path := filepath.Join(cwd, "new-dir", "test-file.txt")
    newFilePath := filepath.FromSlash(path)
    file, err := os.Create(newFilePath)
    if err != nil {
        fmt.Println(err)
    }
    defer file.Close()
    fmt.Printf("File created successfully at %s\n", newFilePath)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接