GoLang通过POST请求发送文件

时间:2017-08-07 07:40:16

标签: rest post go webserver

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

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

我有这行来调用上传功能

router.POST("/upload", UploadFile)

这是我的上传功能:

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

}

但我无法在/upload/目录中看到任何已上传的文件......

那么我做错了什么?

P.S我得到第二个错误=> error opening file,所以我认为文件上传或从UploadFile函数获取文件有问题,对吗?如果是,那么我可以如何从此功能中获取或获取文件到postFile功能?

2 个答案:

答案 0 :(得分:3)

12 & 8 // true (01010 & 01000 => 01000) 15 & 8 // true (01111 & 01000 => 01000) 7 & 8 // false (00111 & 01000 => 00000) 17 & 8 // false (10001 & 01000 => 00000) 生成多部分消息,这不是您想要用来从客户端接收文件并将其保存到磁盘的内容。

假设您要从客户端上传文件,例如使用multipart.Writer的浏览器,您应该使用FormFile而不是Content-Type: application/x-www-form-urlencoded,它会返回r.Form.Get值,其中包含客户端发送的文件内容以及您可以使用的文件内容使用*multipart.File或不是。

将内容转移到磁盘

答案 1 :(得分:2)

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

  

func打开

     

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

     

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

     

func创建

     

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

     

Create使用模式0666(在umask之前)创建命名文件,   如果它已经存在则截断它。如果成功,方法就可以了   返回文件可用于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)

}