从 io 中提取文件名。ReadCloser

我需要获取从前端接收后端的某些文件的文件名。后端(在 Go 中实现)将以 .有没有办法从中提取它?io.ReadCloserio.ReadCloser



慕的地6264312
浏览 225回答 5
5回答

BIG阳

后端(在 Go 中实现)将以 io 的形式接收文件。ReadCloser.有没有办法从io中提取它。ReadCloser?不。看看io的方法。ReadCloser 通过运行提供,并注意没有一个方法可以提供名称。所以除非你什么都不知道,它是一个io。ReadCloser 你根本做不到。go doc io.ReadCloser

宝慕林4294392

package mainimport (    "errors"    "fmt"    "io"    "os")func fatalln(err error) {    fmt.Fprintln(os.Stderr, err)    os.Exit(1)}// hasName interface is an interface that expects types// that implements it to have "Name() string" method.type hasName interface {    Name() string}func open(name string) (io.ReadCloser, error) {    f, err := os.Open(name)    if err != nil {        return nil, err    }    // f implements io.ReadCloser interface as *os.File    // has Read and Close methods.    return f, nil}func main() {    // rc is of the type io.ReadCloser    rc, err := open("example.txt")    if err != nil {        fatalln(err)    }    defer rc.Close()    // Type assetion to check rc's underlying type has    // a method "Name() string".    f, ok := rc.(hasName)    if !ok {        fatalln(errors.New("type assertion failed"))    }    // Yay, type assertion succeeded. Print the name!    fmt.Println("Name:", f.Name())}

慕工程0101907

通过定义嵌入的接口,您可以预先需要一个方法:io.ReaderName()package mainimport (    "fmt"    "io"    "log"    "os")type NamedReadCloser interface {    io.ReadCloser    Name() string}func doThings(f NamedReadCloser) error {    defer f.Close()    b, err := io.ReadAll(f)    if err != nil {        return err    }    fmt.Printf("Name: %s, Content: %s\n", f.Name(), b)    return nil}func main() {    f, err := os.Open("/etc/hosts")    if err != nil {        log.Fatal("Cannot open file: ", err)    }    err = doThings(f)    if err != nil {        log.Fatal("Error doing things: ", err)    }}仅当传入的内容具有 name 方法(如 .如果没有,那么您试图做的事情是不可能的。*os.File

慕森王

这是运行时读取器的读取器,当前端将文件发送到后端时,它从网络读取文件。您必须根据请求本身进行工作才能获得该文件名。这是一个假设,但在大多数情况下,对于文件上传,请求是多部分请求。如果您有相同的情况,则可以读取标头,通常用于标识文件类型。Go Native具有解析细节的能力。你可以试试这个 :io.ReadCloserContent-Dispositionhttp.RequestformFile, handler, err := r.FormFile("file")  // read file from network with key "file"defer formFile.Close()fileName := handler.Filename // Get file name

暮色呼如

您必须使用方法将其转换为类型:Namepackage mainimport (   "io"   "os")func open(name string) (io.ReadCloser, error) {   return os.Open(name)}func main() {   c, e := open("file.txt")   if e != nil {      panic(e)   }   defer c.Close()   f := c.(*os.File)   println(f.Name())}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go