为了账号安全,请及时绑定邮箱和手机立即绑定

从 io 中提取文件名。ReadCloser

从 io 中提取文件名。ReadCloser

Go
慕的地6264312 2022-09-05 17:37:08
我需要获取从前端接收后端的某些文件的文件名。后端(在 Go 中实现)将以 .有没有办法从中提取它?io.ReadCloserio.ReadCloser
查看完整描述

5 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

后端(在 Go 中实现)将以 io 的形式接收文件。ReadCloser.有没有办法从io中提取它。ReadCloser?

不。

看看io的方法。ReadCloser 通过运行提供,并注意没有一个方法可以提供名称。所以除非你什么都不知道,它是一个io。ReadCloser 你根本做不到。go doc io.ReadCloser


查看完整回答
反对 回复 2022-09-05
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

package main


import (

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

}


查看完整回答
反对 回复 2022-09-05
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

通过定义嵌入的接口,您可以预先需要一个方法:io.ReaderName()


package main


import (

    "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


查看完整回答
反对 回复 2022-09-05
?
慕森王

TA贡献1777条经验 获得超3个赞

这是运行时读取器的读取器,当前端将文件发送到后端时,它从网络读取文件。您必须根据请求本身进行工作才能获得该文件名。这是一个假设,但在大多数情况下,对于文件上传,请求是多部分请求。如果您有相同的情况,则可以读取标头,通常用于标识文件类型。Go Native具有解析细节的能力。你可以试试这个 :io.ReadCloserContent-Dispositionhttp.Request


formFile, handler, err := r.FormFile("file")  // read file from network with key "file"

defer formFile.Close()


fileName := handler.Filename // Get file name


查看完整回答
反对 回复 2022-09-05
?
暮色呼如

TA贡献1853条经验 获得超9个赞

您必须使用方法将其转换为类型:Name


package main


import (

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

}


查看完整回答
反对 回复 2022-09-05
  • 5 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信