GoLang 通过 POST 请求发送文件

vla*_*mir 7 rest post webserver go

我是 GoLang 语言的新手,我想创建 REST API WebServer 来上传文件...

所以我通过向我的服务器的 POST 请求被困在主要功能(文件上传)中......

我有这条线用于调用上传功能

router.POST("/upload", UploadFile)
Run Code Online (Sandbox Code Playgroud)

这是我的上传功能:

func UploadFile( w http.ResponseWriter, r *http.Request, _ httprouter.Params ) {
    io.WriteString(w, "Upload files\n")
    postFile( r.Form.Get("file"), "/uploads" )
}

func postFile(filename string, targetUrl string) error {
    bodyBuf := &bytes.Buffer{}
    bodyWriter := multipart.NewWriter(bodyBuf)

    // this step is very important
    fileWriter, err := bodyWriter.CreateFormFile("file", filename)
    if err != nil {
        fmt.Println("error writing to buffer")
        return err
    }

    // open file handle
    fh, err := os.Open(filename)
    if err != nil {
        fmt.Println("error opening file")
        return err
    }

    //iocopy
    _, err = io.Copy(fileWriter, fh)
    if err != nil {
        panic(err)
    }

    bodyWriter.FormDataContentType()
    bodyWriter.Close()

    return err

}
Run Code Online (Sandbox Code Playgroud)

但是我在我的/upload/目录中看不到任何上传的文件...

那么我做错了什么?

PS 我收到第二个错误 => error opening file,所以我认为文件上传或从UploadFile函数获取文件有问题,对吗?如果是,那么我如何从这个函数中获取或获取文件来postFile运行?

Fre*_*ind 3

os.Open将打开一个文件,因为该文件不存在,您将收到错误消息。相反,使用os.Create它将创建一个新文件并打开它。(参考: https: //golang.org/pkg/os/#Open

功能打开

func Open(name string) (*File, error)

打开打开指定的文件进行读取。如果成功,则可以使用返回文件上的方法进行读取;关联的文件描述符的模式为 O_RDONLY。如果有错误,则其类型为 *PathError。

函数创建

func Create(name string) (*File, error)

Create 使用模式 0666(在 umask 之前)创建命名文件,如果该文件已存在,则将其截断。如果成功,返回的 File 上的方法可用于 I/O;关联的文件描述符的模式为 O_RDWR。如果有错误,则其类型为 *PathError。

编辑

创建一个新的处理程序作为示例:并且还使用 OpenFile,如所提到的:GoLang send file via POST request

func Upload(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Upload files\n")

    file, handler, err := r.FormFile("file")
    if err != nil {
        panic(err) //dont do this
    }
    defer file.Close()

    // copy example
    f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        panic(err) //please dont
    }
    defer f.Close()
    io.Copy(f, file)

}
Run Code Online (Sandbox Code Playgroud)