【问题标题】:GoLang send file via POST requestGoLang 通过 POST 请求发送文件
【发布时间】:2021-08-30 18:05:25
【问题描述】:

我是 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 函数?

【问题讨论】:

    标签: rest post go webserver


    【解决方案1】:

    multipart.Writer 生成多部分消息,这不是您想要用于从客户端接收文件并将其保存到磁盘的东西。

    假设您从客户端上传文件,例如浏览器,使用Content-Type: application/x-www-form-urlencoded,您应该使用FormFile 而不是r.Form.Get,它返回一个*multipart.File 值,其中包含客户端发送的文件内容,您可以使用该值将该内容写入磁盘io.Copy或者什么不是。

    【讨论】:

      【解决方案2】:

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

      功能打开

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

      Open 打开指定文件 阅读。如果成功,返回文件上的方法可用于 阅读;相关文件描述符的模式为 O_RDONLY。如果有 一个错误,它将是 *PathError 类型。

      函数创建

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

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

      编辑

      做一个新的handler作为例子: 并且还使用了以下提到的 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)
      
      }
      

      【讨论】:

      • golang.org/pkg/os/#OpenFile 可以让您进行比其他功能更准确的模式管理。
      • 好的,但是我怎样才能得到要发送到服务器的文件呢?因为我可以创建文件,但它与我发送的不同......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2021-05-03
      相关资源
      最近更新 更多