如何使用Golang获取发布的二进制数据的文件名?

3lxsmp7m  于 2023-09-28  发布在  Go
关注(0)|答案(3)|浏览(113)

我使用Postman REST API客户端将csv文件作为二进制文件发布。我需要获取上传文件的文件名。

下面是一个简单的示例,将csv文件作为二进制数据发布,并将二进制数据存储为csv文件。

package main

import (   //"fmt"
           "net/http"
           "os"
           "io"
           "log"
           "github.com/gorilla/mux"
       )

func uploadData(w http.ResponseWriter, req *http.Request) {
    file, err := os.Create("hello.csv")
    _, err = io.Copy(file, req.Body)
    _ = err
}

func main(){
  router := mux.NewRouter()
  router.HandleFunc("/parse", uploadData).Methods("POST")
  log.Fatal(http.ListenAndServe(":8000", router))
}
gdrx4gfi

gdrx4gfi1#

你可以使用一个编码,比如form-data,它包含了通过postman上传文件的文件名。这将帮助您向服务器发送multipart/form-data请求。之后,您可以从服务器端提取文件名。

从服务器端

func uploadData(w http.ResponseWriter, req *http.Request) {
    _, header, _ := req.FormFile("demo")
    fmt.Println(header.Filename)
}
rsaldnfx

rsaldnfx2#

因为,没有与HTTP请求主体相关联的文件名。如果你想得到文件名,你必须在你的URL中发送文件名。

package main

import (   
           "net/http"
           "os"
           "io"
           "log"
           "github.com/gorilla/mux"

       )

func uploadData(w http.ResponseWriter, req *http.Request) {
    params := mux.Vars(req)
    file, err := os.Create(params["fileName"])
    _, err = io.Copy(file, req.Body)
    if err!=nil{
      log.Printf("Error while Posting data")
    }
}

func main(){
  router := mux.NewRouter()
  router.HandleFunc("/upload/{fileName}", uploadData).Methods("POST")
  log.Fatal(http.ListenAndServe(":8000", router))
}
lnvxswe2

lnvxswe23#

如果你通过二进制数据发送文件,那么HTTP请求中的所有正文都将被该数据的二进制文件填充。
正如我们提到的,现在http请求体只包含我们发送的文件中的字节。
和文件名信息不包括在二进制文件,前jpg,png,gif,或更多。
对于二进制文件,唯一的方法可能是猜测它使用的是什么类型的格式bytes.Contain()。示例png文件必须以相同的8字节开始,即137 80 78 71 13 10 26 10,您可以在这里找到更多https://en.wikipedia.org/wiki/List_of_file_signatures

相关问题