-
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())}